存储和检索QFlags

时间:2012-09-25 00:33:50

标签: qt4 bit-manipulation

我打算使用QFlags进行位操作,我有很多位要设置(大约400),我现在面临的问题是如果我将QFlags转换为int我得到2 ^ 400,我无法将其存储在数据库中,所以我的问题是有一种方法可以将QFlags存储在数据库中。

1 个答案:

答案 0 :(得分:1)

我假设您的意思是SQL数据库。您可以创建一个包含每个位值的查找表:

CREATE TABLE flags (
    id INT NOT NULL,
    name VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
);

然后这是一个简单的多对多参考:

CREATE TABLE my_objects (
    id INT NOT NULL,
    ...
    PRIMARY KEY (id)
);

CREATE TABLE object_flags (
    object_id INT NOT NULL,
    flag_id INT NOT NULL,
    value BOOLEAN NOT NULL,
    FOREIGN KEY (object_id) REFERENCES my_object(id),
    FOREIGN KEY (flag_id) REFERENCES flags(id)
);

当您将值保存到数据库时,它看起来像:

QSqlQuery query;
query.prepare("INSERT INTO object_flags (object_id, flag_id, value) VALUES(:oid, :fid, :flag_value)")
query.bind(":oid", my_object->id);
query.bind(":fid", id_of_flag_1);
query.bind(":flag_value", my_object->flags.testFlag(MyFlagsEnum::my_flag_1));
query.exec();
// etc for my_flag_2 and so on

加载:

QSqlQuery query;
query.prepare("SELECT oflags.value, fl.name FROM object_flags AS oflags INNER JOIN flags AS fl WHERE oflags.id = :oid");
query.bind(":oid", my_object->id);

while(query.next()) {
    bool flag = query.values(0).toBool();
    QString flag_name = query.values(1).toString();
    if(flag_name == "my_flag_1" && flag)
        my_object->flags |= MyFlagsEnum::my_flag_1;
    // etc for my_flag_2 and so on
}

每个旗帜都会重复。我对Qt的元数据系统不太熟悉,知道是否有更有效的方法来获取标志数据。也许你可以利用X-Macros来节省一些打字。