【问题标题】:How to store enum in SQLite database如何将枚举存储在 SQLite 数据库中
【发布时间】:2010-12-10 00:03:32
【问题描述】:

我正在尝试使用 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”(即属性为 not null),但 null 值存储在 db 中。

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

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

编辑:

我刚刚检查并持有我的枚举的 QVariant 声称它不能转换为 QString 或 int(canConvert&lt;int&gt;()canConvert&lt;QString&gt;() 返回 false)。有没有办法添加这种转换?

【问题讨论】:

    标签: c++ sql qt sqlite enums


    【解决方案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 传输。

    如果您找到更优雅的解决方案,请告诉我,我很乐意接受您的回答。

    【讨论】:

      【解决方案2】:

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

      enum partyType { typeCompany=1, typePerson };
      

      【讨论】:

      • 如果第一个枚举数没有初始值,则默认分配为 0。
      猜你喜欢
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 2023-03-07
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多