2012-09-25 3 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