2

2つのSQLiteデータベースがあり、それぞれに同じキーを持つ行をマージして同期を維持する必要があるテーブルがあります。テーブルは次のようにレイアウトされています。

CREATE TABLE titles ( name    TEXT    PRIMARY KEY,
                      chapter TEXT               ,
                      page    INTEGER DEFAULT 1  ,
                      updated INTEGER DEFAULT 0  );

2つのテーブルのそれぞれで同じコマンドを実行できるようにしたいのですが、その結果、同じ名前の行のペアの場合、 updatedで値が大きい方の行が他の行を完全に上書きし、そうでない行は上書きされます。一致するものがコピーされるため、終了時に両方のテーブルが同一になります。

これはAndroidアプリ用なので、Javaで比較を実行できますが、可能であればSQLiteソリューションを使用したいと思います。私はSQLの経験があまりないので、説明が多ければ多いほど役に立ちます。

編集
明確にするために:他のコードによって呼び出されるように、任意の時間に実行できるものが必要です。2つのデータベースの一方が常に存在するわけではなく、もう一方の操作が発生したときに完全に完全な状態ではない可能性があるため、トリガーが機能するとは思いません。

4

2 に答える 2

0

このために、トリガーを使用できます。

すなわち

CREATE TRIGGER sync_trigger 
AFTER INSERT OR UPDATE OF updated ON titles
REFERENCING NEW AS n
FOR EACH ROW
DECLARE updated_match;
DECLARE prime_name;
DECLARE max_updated;
BEGIN
    SET prime_name = n.name;
    ATTACH database2name AS db2;
    SELECT updated
    INTO updated_match
    FROM db2.titles t
    WHERE t.name=prime_name)

    IF updated_match is not null THEN
        IF n.updated > updated_match THEN
            SET max_updated=n.updated;
        ELSE
            SET max_updated=updated_match;
        END IF;

        UPDATE titles
        SET updated=max_updated
        WHERE name=prime_name;

        UPDATE db2.titles
        SET updated=max_updated
        WHERE name=prime_name;
    END IF;
END sync_trigger;

構文が少しずれている可能性があります。私はそれほど頻繁にトリガーを使用することはなく、これはかなり複雑なものですが、少なくともどこから始めればよいかがわかるはずです。これを一方のデータベースに割り当て、「database2name」をもう一方のデータベースの名前に交換してから、もう一度もう一方のデータベースに割り当て、「database2name」をもう一方のデータベースに交換する必要があります。

お役に立てれば。

于 2013-02-24T05:11:52.967 に答える
0

他のデータベースをメインデータベースに接続していると仮定します。

ATTACH '/some/where/.../the/other/db-file' AS other;

フィールドが他のテーブルupdatedの対応するフィールドよりも小さいため、最初に上書きされるすべてのレコードを削除できます。updated

DELETE FROM main.titles
WHERE updated < (SELECT updated
                 FROM other.titles
                 WHERE other.titles.name = main.titles.name);

次に、新しく欠落しているすべてのレコードをコピーします。

INSERT INTO main.titles
SELECT * FROM other.titles
WHERE name NOT IN (SELECT name
                   FROM main.titles);

逆方向に更新するには、main/otherデータベース名を交換します。

于 2013-02-24T11:13:07.083 に答える