0
我打算使用QFlags
进行位操作,我有很多位设置(约400),现在我面临的问题是如果我将QFlags
转换为int我得到2^400,我无法将它存储在数据库中,所以我的问题是否存在将QFlags
存储在数据库中的方法。存储和检索QFlags
我打算使用QFlags
进行位操作,我有很多位设置(约400),现在我面临的问题是如果我将QFlags
转换为int我得到2^400,我无法将它存储在数据库中,所以我的问题是否存在将QFlags
存储在数据库中的方法。存储和检索QFlags
我假设你的意思是一个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来保存一些输入。
我正在使用Sqlite。 – SIFE
应该在那里。我还没有测试过它。 – cmv
但我不明白如何使用这些表。 – SIFE