2014-11-03 63 views
0

我正在創建Android應用程序,現在我被困在正確的數據庫設計中。2個表的Android SQLite外鍵

我在我的本地SQLite數據庫3個表:

BOXES 
id 
title
NOTES 
id 
title 
content
BOXES_NOTES 
id 
box_id 
element_id 
type

元素ID是ID爲NOTES.idBOXES.id,現在我想讓它作爲外鍵,所以當我刪除條目BOXESNOTES,我想更新BOXES_NOTES表適當。我該怎麼做?

回答

1
CREATE TABLE BOXES_NOTES(
ID .... REFERENCES NOTES(ID) ON DELETE /*your constraint*/ 
BOX_ID ... REFERENCES BOXES(ID) ON DELETE /*your constraint*/ 
...) 

ON DELETE後,您可以添加:

NO ACTION - >你不能刪除一個盒子行,如果有至少一個ID爲box_notes

CASCADE - >如果你刪除一個盒子行與該ID的所有boxes_notes行將被刪除

​​- >如果你刪除一個盒體排與該ID的所有boxes_notes行會被設置爲null(如果可能)

ON DELETE的含義同樣適用於ON UPDATE。

請記住,使用SQLite你必須避免外鍵控制。我建議你使用SQLiteOpenHelper並覆蓋這樣的的OnOpen方法:

public void onOpen(SQLiteDatabase db){ 
    super.onOpen(db); 
    if (!db.isReadOnly()) { 
      // Enable foreign key constraints 
      db.execSQL("PRAGMA foreign_keys=ON"); 
    } 
} 
+0

謝謝你的回答。但是,如何使element_id引用記錄中的id或框中的id? – Array 2014-11-03 12:08:14

+0

請注意,「box_id」是包含幾個元素(如文件夾)的文本框。每個盒子可以包含其他盒子或筆記,當刪除任何元素時,我想從BOXES_NOTES中刪除條目(如果帶有元素的盒子被刪除 - 刪除所有具有該盒子ID的條目,如果元素(盒子或其他盒子中的音符)被刪除 - 刪除只有條目與該element_id) – Array 2014-11-03 12:14:41

0
[box_id] INTEGER CONSTRAINT [box_ref] REFERENCES [BOXES]([id]) ON DELETE CASCADE NOT NULL, 
[element_id] INTEGER CONSTRAINT [notes_ref] REFERENCES [NOTES]([id]) ON DELETE CASCADE NOT NULL, 

,因爲我們有級聯兩個box_id和element_id中,箱或在此刪除會級聯刪除入門講義中的任何條目刪除表

的建議 - 用正確的命名約定 代替element_id名字它notes__id(通常用來命名外鍵

雙下劃線所有這些在sqlite的一個重要的工作是,w^Ë必須能夠在數據庫級別的外鍵約束默認情況下是在Android的

禁用啓用外鍵約束做下面的 db.execSQL(「PRAGMA foreign_keys = ON;」);

+0

感謝您的迴應,但請在第一篇文章中查看評論:element_id可以是box_id或note_id(所以它可以引用到** BOXES **表中的ID或** NOTES **表)。 – Array 2014-11-03 13:53:17

0

沒關係,我重新設計DB一點點,所以現在我只有2個表:

BOXES 
id 
title 
box_id
NOTES 
id 
title 
content 
box_id 

謝謝大家的答案。