我正在創建Android應用程序,現在我被困在正確的數據庫設計中。2個表的Android SQLite外鍵
我在我的本地SQLite數據庫3個表:
BOXES id title
NOTES id title content
BOXES_NOTES id box_id element_id type
元素ID是ID爲NOTES.id或BOXES.id,現在我想讓它作爲外鍵,所以當我刪除條目BOXES或NOTES,我想更新BOXES_NOTES表適當。我該怎麼做?
我正在創建Android應用程序,現在我被困在正確的數據庫設計中。2個表的Android SQLite外鍵
我在我的本地SQLite數據庫3個表:
BOXES id title
NOTES id title content
BOXES_NOTES id box_id element_id type
元素ID是ID爲NOTES.id或BOXES.id,現在我想讓它作爲外鍵,所以當我刪除條目BOXES或NOTES,我想更新BOXES_NOTES表適當。我該怎麼做?
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");
}
}
[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;」);
感謝您的迴應,但請在第一篇文章中查看評論:element_id可以是box_id或note_id(所以它可以引用到** BOXES **表中的ID或** NOTES **表)。 – Array 2014-11-03 13:53:17
沒關係,我重新設計DB一點點,所以現在我只有2個表:
BOXES id title box_id
NOTES id title content box_id
謝謝大家的答案。
謝謝你的回答。但是,如何使element_id引用記錄中的id或框中的id? – Array 2014-11-03 12:08:14
請注意,「box_id」是包含幾個元素(如文件夾)的文本框。每個盒子可以包含其他盒子或筆記,當刪除任何元素時,我想從BOXES_NOTES中刪除條目(如果帶有元素的盒子被刪除 - 刪除所有具有該盒子ID的條目,如果元素(盒子或其他盒子中的音符)被刪除 - 刪除只有條目與該element_id) – Array 2014-11-03 12:14:41