2012-09-25 101 views
0

我打算使用QFlags進行位操作,我有很多位設置(約400),現在我面臨的問題是如果我將QFlags轉換爲int我得到2^400,我無法將它存儲在數據庫中,所以我的問題是否存在將QFlags存儲在數據庫中的方法。存儲和檢索QFlags

回答

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來保存一些輸入。

+0

我正在使用Sqlite。 – SIFE

+0

應該在那裏。我還沒有測試過它。 – cmv

+0

但我不明白如何使用這些表。 – SIFE