2

JavaライブラリにSQLiteDatabaseを使用していますが、外部キーをサポートするSQLiteバージョンには付属していない非常に低いバージョンのAndroid API(v4)をサポートする必要があります。

したがって、最上位のデータとそのすべての「子」を削除するには、外部キー制約と同じ効果を手動で再現するような方法で、これらの子を事前に削除する必要があります。ON DELETE CASCADE

私がやろうとしているのは、削除APIを使用した次のSQLです。

DELETE FROM childTable 
WHERE someFK IN (
    SELECT parent_id 
    FROM parentTable 
    WHERE someFlag = 1
)

私が思いついた最初の解決策は、次のようにwhere句にselectクエリをハードコーディングすることでしたが、SQLiteDatabase apiはクエリやexecSQLなどをサポートしているため、このソリューションはひどく間違っており、使用するのは危険ですか?回避策:

String[] whereArgs = {Integer.toString(1)};
this.database.delete(TABLE_CHILD_ONE, COL_ONE_FK_SESSION+" IN (SELECT "+COL_SESSION_ID+" FROM "+TABLE_SESSIONS+" WHERE "+COL_SESSION_DONE+"=?)", whereArgs);
this.database.delete(TABLE_CHILD_TWO, COL_TWO_FK_SESSION+" IN (SELECT "+COL_SESSION_ID+" FROM "+TABLE_SESSIONS+" WHERE "+COL_SESSION_DONE+"=?)", whereArgs);
this.database.delete(TABLE_CHILD_THREE, COL_THREE_FK_SESSION+" IN (SELECT "+COL_SESSION_ID+" FROM "+TABLE_SESSIONS+" WHERE "+COL_SESSION_DONE+"=?)", whereArgs);
4

1 に答える 1

1

テーブルごとにトリガーを作成できます。

CREATE TRIGGER delete_cascade AFTER DELETE ON parentTable
BEGIN
    DELETE FROM childTable child WHERE child.parent_id=OLD.id;
END;

トランザクションで実行します。

トリガーの詳細

于 2012-07-10T17:51:49.277 に答える