我正在開發使用SQLite數據庫支持的Android 2.2以上版本的應用程序。我試圖在創建表時定義引用完整性約束。我還通過在SQLiteOpenHelper
onCreate
和onOpen
方法執行db.execSQL("PRAGMA foreign_keys=ON;");
啓用外鍵支持。事後設置我的表和正確的外鍵參考,它仍然允許我在表中缺少參考記錄的表中有insert
行。對於例如我下面的結構的Android 2.2 + SQLite的+定義參照完整性約束
CREATE TABLE Questions(_id integer primary key,question text not null);
CREATE TABLE Ques_Ans(_id integer primary key autoincrement,qid integer not null,
aid integer not null,is_correct integer default 0,
FOREIGN KEY (qid) REFERENCES Questions(_id));
,並在表後我的數據
INSERT INTO Questions VALUES(1, 'Some text');
INSERT INTO Ques_Ans(qid, aid, is_correct) VALUES(20, 1, 0);
如果外鍵被正確的Ques_Ans表設置,第二插入會失敗,因爲在Questions
表中沒有紀錄編號20
,但不知何故我的應用程序不會引發任何錯誤,並插入第二個插入語句。任何人都可以告訴我這裏有什麼錯,或者我錯過了這裏的任何配置嗎?
更新[03 - 2012]:使用sqlite3
工具與@Catcall
- 話題後,如果通過應用程序上使用仿真器或對預期
- 同樣的事情
PRAGMA foreign_keys=ON;
外鍵切換工作電話不工作 - 使用
insert()
或execSQL()
執行INSERT語句。他們沒有扔foreign key constraint failed
錯誤 PRAGMA integrity_check
回報ok
。所以數據庫沒有損壞。
+1僅僅用於包含我們可能需要重現問題的所有SQL。 – 2012-03-01 02:54:25
只是對未來的讀者的一個說明同樣的事情存在於2015年也 – 2015-01-08 04:54:19