我正在尝试使用QSql将枚举存储在SQLite数据库中。 我有以下课程:
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)。有没有办法添加这种转换?
答案 0 :(得分:2)
我没有找到任何方法来使用用户类型的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()
返回的值注册我的自定义类型,并对每个应用&lt; - &gt; db transfer执行转换。
如果您找到更优雅的解决方案,请告诉我,我们很乐意接受您的回答。
答案 1 :(得分:0)
只需将初始值分配给枚举中的第一个元素,编译器会自动增加任何进一步的定义,然后将此值保存到数据库中?你可能不得不在int之间来回转换,但qvariant应该为你处理。
即
enum partyType { typeCompany=1, typePerson };