2012-04-16 81 views
1

我有以下表結構:sqlite的替換鍵和外鍵Android中

Table Days:   [_id,date,name] 
        ^
         | 
Table Events: [_id, day_id ,description] 

外鍵day_id設置爲ON DELETE CASCADE

我想「插入或更新」 2天。所以我做:

ContentValues values= new ContentValues(); 
values.put("_id",2); 
values.put("date,"..."); 
values.put("name","welcome"); 
mDb.replace("days",null,values); 

的問題是,如果day_id = 2已經存在(在我的情況是最可能的選項)中用到dbengine刪除該表,並插入一個新行,因此所有的事件關聯到d ay也被刪除。

此解決方案的工作原理,但其非常不理想的權利?

try { 
     mDb.insertOrThrow("days", null, values); 
    } catch (Exception e) { 
     mDb.update("days", values, "_id=2", null); 
    } 

請告訴我正確的sollution對於這個問題

回答

2

你應該爲了讓SQLite的刪除或自動更新引用的列添加您參考如下。

FOREIGN KEY [_id]參考文獻[天] ON DELETE CASCADE ON UPDATE CASCADE

+0

謝謝您的回答。我不想更新day _id,只是「插入或更新」它,但該指令不存在於sqlite的權利? (如果在插入「已更新的」之前刪除舊行,則使用替換與天關聯的事件級聯刪除) – Addev 2012-04-16 12:55:19

+0

如果更新主鍵,** ON UPDATE CASCADE **將自動反映其引用中的更改列,所以你不需要擔心刪除,然後插入它 – waqaslam 2012-04-16 13:00:36

+1

,但如果列已經存在,替換命令會自動執行(刪除+插入)=( – Addev 2012-04-16 13:44:19