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

发布于 2024-10-07 09:08:34 字数 1175 浏览 1 评论 0原文

我正在尝试使用 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< /strong> null), null 值存储在 db.

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

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

编辑:

我刚刚检查过,持有枚举的 QVariant 声称它无法转换为 QString 或 int (canConvert()canConvert< QString>() 返回 false)。有没有办法添加这个转换?

I'm trying to store enum in SQLite database using QSql.
I have following 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");

I do insert like this:

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();

Although qDebug() prints "false" (i.e. property is not null), null value is stored in db.

I've tried with column of type TEXT and INTEGER with no success.

Can you tell me what I'm doing wrong?

EDIT:

I've just checked and QVariant holding my enum claims it can't be converted to QString or int (canConvert<int>() and canConvert<QString>() return false). Is there a way to add this conversion?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

请爱~陌生人 2024-10-14 09:08:34

我没有找到任何方法来使用用户类型的 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() 返回的值注册自定义类型,并在每个应用<->数据库传输上执行转换。

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

I didn't find any way to use auto conversion of QVariants of user type. Therefore I've created singleton storing rules for conversion.

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

I register my custom types using value returned from qRegisterMetaType() and perform conversions on each app<->db transfer.

Please let me know if you find any more elegant solution and I'll be happy to accept your answer.

呆° 2024-10-14 09:08:34

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

IE

enum partyType { typeCompany=1, typePerson };

Just assign initial value to the first element in your enum, and the compiler will auto-increment any further definitions, then save this value to your database? You may have to cast it back and forth between an int, but qvariant should take care of that for you.

ie

enum partyType { typeCompany=1, typePerson };
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文