如何在SQLite数据库中存储枚举

时间:2010-12-10 00:03:33

标签: c++ sql qt sqlite enums

我正在尝试使用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)。有没有办法添加这种转换?

2 个答案:

答案 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 };