2010-12-10 6 views
2

Я пытаюсь сохранить перечисление в базе данных SQLite с помощью 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(); 

Althou gh qDebug() печатает "false" (т. свойство не null), значение null хранится в db.

Я пробовал с колонкой типа TEXT и INTEGER без успеха.

Можете ли вы сказать мне, что я делаю неправильно?

EDIT:

Я только что проверил и QVariant затаив перечисление утверждает, что она не может быть преобразована в QString или Int (canConvert<int>() и canConvert<QString>() возвратной ложь). Есть ли способ добавить это преобразование?

ответ

1

я не нашел способ использовать автоматическое преобразование QVariants типа пользователя. Поэтому я создал правила хранения singleton для преобразования.

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() и выполнять преобразования на каждом приложении < -> Передача дб.

Пожалуйста, дайте мне знать, если вы найдете более элегантное решение, и я буду рад принять ваш ответ.

0

Просто присвойте начальное значение первому элементу в вашем перечислении, и компилятор автоматически увеличит любые дополнительные определения, а затем сохранит это значение в своей базе данных? Возможно, вам придется бросить его туда и обратно между int, но qvariant должен позаботиться об этом для вас.

т.е.

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

Если первый счетчик не имеет начального значения, он по умолчанию присваивается 0. – zarzych 2010-12-10 08:51:38

Смежные вопросы