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

标签 c++ sql qt sqlite enums

我正在尝试使用 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/

相关文章:

c++ - 自上而下的动态编程 VS 递归朴素解决方案。检查运行时执行

C++:将结构传递给函数,无法理解语法

mysql - 如果使用 MySQL 存在行,则获取列?

mysql - 从表中获取列值作为 sql 查询结果中的键

sql - SQL Server 中根据列值连接表

c++ - 外部存储器上的 QDataStream?

Qt - 信号槽中的参数

c++ - QML 和 C++ 图像互操作性

c++ - 移除 QJsonArray 中的所有元素

C++ 错误 : no matching function for all to