2012-05-23 66 views
13

我有工作「天」作爲創建的表如下外鍵約束不是在SQLite數據庫Android上

"create table days(" + 
      "day_id integer primary key autoincrement, " + 
      "conference_id integer , " + 
      "day_date text, " + 
      "day_start_time text, " + 
      "day_end_time text, " + 
      "day_summary text, " + 
      "day_description text)"; 

和我已經創建曲目表如上圖所示如下

CREATE_TABLE_TRACK = "create table track(" + 
     "track_id integer primary key autoincrement," + 
     "day_id integer,"+ 
     "track_name text," + 
     "track_description text," + 
     " FOREIGN KEY(day_id) REFERENCES days(day_id) ON DELETE CASCADE)"; 

我有外鍵day_id引用到的表天day_id ...

所以我想的是,如果我刪除的日期則對應的軌道也應該刪除...但它簡化版,發生在我的情況..

我有源碼的版本3.5.9

並且還我在我的輔助類中加入1線作爲

> db.execSQL( 「PRAGMA foreign_keys = ON;」);

,但仍然無法工作..請幫助我..

+0

但我說,我已經添加了線「PRAGMA foreign_keys = ON;」在我的sqlite幫助類 – NullPointerException

回答

9

級聯刪除之前,不支持sqlite的版本3.6.19,這是第一個包含在Android 2.2。

幸運的是有一個替代。

您可以在創建表的查詢執行以下這樣的另一個查詢:

db.execSQL("CREATE TRIGGER delete_days_with track BEFORE DELETE ON track " 
     + "FOR EACH ROW BEGIN" 
     +   " DELETE FROM days WHERE track.day_id = days.day_id " 
     + "END;"); 

注意delete_days_with_track僅僅是描述性的觸發做什麼名字,而這僅僅是我用的模式;我相信你可以將它命名爲任何你想要的。

+4

這不適合我。我必須使用(WHERE OLD.day_id = days.day_id)來使它工作。我花了很多時間直到我發佈它。欲瞭解更多信息。 http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers –

+0

有趣。我在Ubuntu 12.04機器上安裝了3.7.9版本,並且ON DELETE CASCADE也不起作用。奇怪的是,也沒有觸發器:翻譯爲給定的例子,它聲稱「錯誤:沒有這樣的列:track.day_id」 - 雖然「SELECT * FROM曲目JOIN天ON track.day_id = days.day_id」工作正常。我很困惑。 – Izzy

1

據外鍵的SQLite Documentation支持未添加到3.6.19。

使用3.5.9,你必須做你的級聯刪除一些其他方式。

+0

那麼有什麼辦法升級sqlite版本或任何其他方式?因爲我必須在Android版本2.1以上支持我的應用程序 – NullPointerException

+0

您不必手動執行刪除操作,請參閱下面的觸發器查詢。 – jkschneider

+0

@jkschneider,啊,謝謝!我使用SQLite,但我沒有聲稱成爲專家。謝謝你教我新東西。 – Barak