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