0

ビット操作に使用する予定ですQFlags。設定するビットがたくさんあります (約 400)。現在直面している問題は、QFlagsint に変換すると 2 ^ 400 になり、データベースに格納できません。 、QFlagsデータベースに保存する方法があるかどうか私の質問です。

4

1 に答える 1

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を活用してタイピングを節約することができます。

于 2012-09-25T01:15:38.397 に答える