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);