2010-12-10 339 views
2

我想使用QSql在SQLite数据库中存储枚举。 我有以下类:如何在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(); 

Althou gh qDebug()打印“false”(即,属性是不是 null),空值存储在数据库中。

我试过用TEXT和INTEGER类型的列没有成功。

你能告诉我我做错了什么吗?

编辑:

我刚刚检查,并持有的QVariant我的枚举声称,它不能被转换为QString的或INT(canConvert<int>()canConvert<QString>()返回false)。有没有添加此转换的方法?

回答

1

我没有发现任何方式使用用户类型的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()返回,并在每个应用程序<执行转换 - > DB转移。

请让我知道如果你找到更优雅的解决方案,我会很乐意接受你的答案。

0

只需将初始值分配给枚举中的第一个元素,编译器将自动增加任何进一步的定义,然后将该值保存到数据库中?你可能需要在int之间来回转换,但qvariant应该为你处理。

enum partyType { typeCompany=1, typePerson }; 
+0

如果第一个枚举器没有初始值,则默认为0。 – zarzych 2010-12-10 08:51:38