Russian Qt Forum

Qt => Базы данных => Тема начата: kuzulis от Март 14, 2016, 19:07



Название: [РЕШЕНО]Сохранить QVariantMap в БД
Отправлено: kuzulis от Март 14, 2016, 19:07
Всем доброго времени.

Имею таблицу с полями "Key" и "Value", где поле key - это строка, а value - любое значение.
Хочу сохранить в поле value данные типа QVariantMap, но что-то ничего не сохраняется, пусто
(но ежели сохранять как QString, Int, Float и пр. - то все норм.)

Код
C++ (Qt)
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QVariant>
 
Q_DECLARE_METATYPE(QVariant)
Q_DECLARE_METATYPE(QVariantMap)
 
int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
 
   qRegisterMetaType<QVariant>("QVariant");
   qRegisterMetaType<QVariantMap>("QVariantMap");
 
   {
       QSqlDatabase db = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), QLatin1String("test"));
       db.setDatabaseName(QLatin1String("foo.db"));
 
       if (!db.open()) {
           qDebug() << "DB opening error:" << db.lastError().driverText();
           return 1;
       }
 
       QSqlQuery query(db);
       // create table "MYTABLE" with two fields: "key" and "value"
       query.prepare(QLatin1String("create table if not exists MYTABLE (key primary key on conflict replace, value)"));
       if (!query.exec()) {
           qDebug() << "DB create table error:" << query.lastError().driverText();
           return 1;
       }
 
       // key for "key" field
       QString mykey = QLatin1String("MyKey");
       // value for "value" field
       QVariantMap sourcemap;
       sourcemap.insert(QString(QLatin1String("mapkey1")), QString(QLatin1String("string")));
       sourcemap.insert(QString(QLatin1String("mapkey2")), int(12));
       sourcemap.insert(QString(QLatin1String("mapkey3")), float(34.56f));
 
       qDebug() << "to send:" << sourcemap;
 
       // set data to db
       query.prepare(QLatin1String("insert into MYTABLE values (?, ?)"));
       query.addBindValue(mykey);
       query.addBindValue(sourcemap);
       if (!query.exec()) {
           qDebug() << "Failed to set the sourcemap:" << sourcemap << "of mykey:" << mykey;
           return 1;
       }
 
       // get data from db
       query.prepare(QLatin1String("select value from MYTABLE where key = ?"));
       query.addBindValue(mykey);
       if (!query.exec()) {
           qDebug() << "Failed to set the sourcemap:" << sourcemap << "of mykey:" << mykey;
           return 1;
       } else if (query.next()) {
           QVariant res = query.value(0);
           qDebug() << "res:" << res;
           QVariantMap resultmap = res.toMap();
           qDebug() << "to receive:" << resultmap;
 
       }
   }
 
   QSqlDatabase::removeDatabase(QLatin1String("test"));
 
   return app.exec();
}
 

вывод:

Цитировать
to send: QMap(("mapkey1", QVariant(QString, "string"))("mapkey2", QVariant(int, 12))("mapkey3", QVariant(float, 34.56)))
res: QVariant(QString, "")
to receive: QMap()

мож кто сталкивался с подобным? какие вообще рекоментации?
перегонять QVariantMap в QByteArray и сохранять уже его?



Название: Re: Сохранить QVariantMap в БД
Отправлено: kuzulis от Март 14, 2016, 19:31
В общем, надо мапы сериализовать в QByteArray и сохранять уже QByteArray в базу.. а потом, при чтении делать обратные преобразования!