Всем доброго времени.
Имею таблицу с полями "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 и сохранять уже его?
В общем, надо мапы сериализовать в QByteArray и сохранять уже QByteArray в базу.. а потом, при чтении делать обратные преобразования!