2012-07-10 70 views
2

我正在使用SQLiteDatabase作爲Java庫,並且需要支持非常低版本的Android API(v4),它不支持帶有支持外鍵的SQLite版本。涉及子查詢的SQLiteDatabase刪除

因此,爲了刪除數據的頂層片和所有它的「孩子」,我需要以這樣的方式之前刪除這些孩子手動複製相同的效果外鍵約束ON DELETE CASCADE

什麼我試圖做的是與刪除API下面的SQL。

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

我想出了最初的解決方案是硬編碼在選擇查詢我的where子句如下,但是由於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); 

回答

1

你可以爲每個表創建觸發器:在交易

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

運行它。

More about triggers