我正在尝试使用 QSql 将枚举存储在 SQLite 数据库中。 我有以下类(class):
partydao.h:
class PartyDao : public QObject
{
public:
enum partyType { typeCompany, typePerson };
private:
Q_OBJECT
Q_ENUMS(partyType)
Q_PROPERTY(partyType type READ type WRITE set_type)
// other declarations
};
Q_DECLARE_METATYPE(PartyDao::partyType)
partydao.cpp:
#include "partydao.h"
static int id = qRegisterMetaType<PartyDao::partyType>("partyType");
我是这样插入的:
PartyDao p;
p.setProperty("type", QVariant::fromValue(PartyDao::typePerson));
QSqlQuery query;
query.prepare("INSERT INTO party (type) values (:type)");
qDebug() << p.property("type").isNull();
query.bindValue(":type", p.property("type"));
query.exec();
虽然 qDebug() 打印“false”(即属性不是 null),但 null 值存储在 db 中。
我尝试过使用 TEXT 和 INTEGER 类型的列,但没有成功。
你能告诉我哪里做错了吗?
编辑:
我刚刚检查过,持有我的枚举的 QVariant 声称它不能转换为 QString 或 int(canConvert<int>()
和 canConvert<QString>()
返回 false)。有没有办法添加此转换?
最佳答案
我没有找到任何方法来自动转换用户类型的 QVariants。因此,我为转换创建了单例存储规则。
struct DbConverter
{
virtual ~DbConverter() {}
virtual QVariant toDbValue(const QVariant &value) = 0;
virtual QVariant fromDbValue(const QVariant &value) = 0;
};
class DbConversion
{
public:
static QVariant toDbValue(const QVariant &value)
{
return instance()->m_converters.contains(value.userType()) ?
instance()->m_converters[value.userType()]->toDbValue(value) :
value;
}
static QVariant fromDbValue(int type, const QVariant &value)
{
return instance()->m_converters.contains(type) ?
instance()->m_converters[type]->fromDbValue(value):
value;
}
static int setConverter(int typeId, DbConverter *converter)
{
instance()->m_converters[typeId] = converter;
return typeId;
}
private:
static DbConversion *instance()
{
static DbConversion *inst = new DbConversion;
return inst;
}
QHash<int, DbConverter*> m_converters;
};
我使用从 qRegisterMetaType()
返回的值注册我的自定义类型,并对每个应用<->数据库传输执行转换。
如果您找到任何更优雅的解决方案,请告诉我,我很乐意接受您的回答。
关于c++ - 如何在 SQLite 数据库中存储枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404431/