我需要将QRect存储在Sqlite数据库中。(我到处找过了,但没有看到任何东西)
Qt/QSQLITE是否会自动将QRect转换为QVariant并处理所需的任何分解,还是必须亲自完成此操作,并将原始值和大小值存储在四个单独的字段中?
如果是这样,并将其推广到其他Qt数据类型,是否可以存储QVector、QList?我会定义这些(和QRect等)吗?在我的表定义中作为BLOB类型?
发布于 2013-08-12 19:24:28
SQLite是一个关系数据库,这些东西不能直接存储C++对象。
实际上,C++对象模型不允许完全透明的持久性,但是您可以尝试使用专门的工具或库来接近。然而,重要的一点是,对象本身必须设计为支持持久性。
如果您不需要透明的持久化,而只需要对对象进行显式存储/检索,那么您只需要选择一个您喜欢的序列化方法(例如,使用单个字符串,或者对属性使用单独的字段)。每个方法都有优点和缺点,这取决于您想要对数据库做什么(例如,您想做什么样的搜索或更新)。
C++的另一个不幸之处是它的元编程能力非常差(只是比C稍好一点),例如,反思是不可能的。
这意味着您需要为需要支持的每个类编写序列化代码,或者需要找到/购买一个外部工具,查看类定义.h将为您生成所需的代码。它必须是一个外部工具,因为序列化是模板元编程非常有限的范围之外的东西。
Qt本身已经有了一些专门的序列化机制QDataStream,因此您可以使用它来满足您的需要:例如,QRect是可序列化的,而如果T是可序列化的,则QList<T>是可序列化的。
使用它需要先序列化到QByteArray,然后将blob存储在SQLite中。例如,在写完之后
template<typename T>
QByteArray serialize(const T& x)
{
QByteArray ba;
QDataStream s(&ba, QIODevice::WriteOnly);
s << x;
return ba;
}
template<typename T>
T deserialize(QByteArray& ba)
{
QDataStream s(&ba, QIODevice::ReadOnly);
T res; s >> res;
return res;
}可以将对象直接序列化为QByteArray。
QByteArray ba = serialize(x);并且您可以用
X x = deserialize<X>(ba);发布于 2013-08-12 19:08:21
您可以将QRect存储在另一个表中,该表将(例如) id, x, y, h, w作为列。
当您想要存储QRect时,在新创建的表中创建新行,获取它的id并将其存储在目标表中。
QVector和QList是容器,其中QRect是一个简单的结构。您可以将它保存在一个单独的表中(每个条目有一行),或者只需将容器保存到serialize列中。
发布于 2013-08-12 19:06:09
不,你必须自己做。如何将QRect存储到Sqlite中取决于您和您的需求。使用QDataStream存储单个值,将整个数据类型序列化为文本、BLOB或其他任何内容.最适合你的。
https://stackoverflow.com/questions/18194582
复制相似问题