2012-02-29 61 views
2

我正在開發使用SQLite數據庫支持的Android 2.2以上版本的應用程序。我試圖在創建表時定義引用完整性約束。我還通過在SQLiteOpenHelperonCreateonOpen方法執行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。所以數據庫沒有損壞。
+0

+1僅僅用於包含我們可能需要重現問題的所有SQL。 – 2012-03-01 02:54:25

+0

只是對未來的讀者的一個說明同樣的事情存在於2015年也 – 2015-01-08 04:54:19

回答

1

你的外鍵在「qid」列上,而不在「_id」列上。

這INSERT語句

INSERT INTO Ques_Ans VALUES(20, 1, 0); 

應該紛紛拋出錯誤

Error: table Ques_Ans has 4 columns but 3 values were supplied 

這INSERT應該會成功。

INSERT INTO Ques_Ans VALUES(20, 1, 0, 0); 

這一個應該失敗。

INSERT INTO Ques_Ans VALUES(21, 2, 0, 0); 
Error: foreign key constraint failed 

後來。 。 。

由於它工作在sqlite的,但不是在你的模擬器,該問題可能在任何模擬器或代碼。

這是數據庫事務的成語。

db.beginTransaction(); 
    try { 
    ... 
    db.setTransactionSuccessful(); 
    } finally { 
    db.endTransaction(); 
    } 

的Android文檔建議使用insert()代替execSQL()。確保你正在捕獲,捕獲或檢查每個可能返回錯誤的函數中的錯誤。所以,例如,如果切換到insert(),請檢查其返回值-1。

如果這沒有幫助,您可以嘗試使用「Java」(例如)標記此問題,或者詢問一個重點關注代碼和捕獲錯誤的新問題。

+0

謝謝@Catcall。最初我輸入了不正確的插入查詢。我通過編輯原始問題來糾正它。 – Jay 2012-03-01 08:06:55

+0

要明確,參照完整性問題依然存在。查詢中的更改只是針對帖子,我的實際代碼已插入腳本,正如我在問題中更正的那樣。因此,將不勝感激在這個問題上的任何幫助 – Jay 2012-03-01 11:17:26

+0

@Jay:您編輯的查詢在這裏失敗,「錯誤:外鍵約束失敗。」嘗試運行'PRAGMA integrity_check;'查看您的數據庫是否損壞。 – 2012-03-01 12:18:59

0

IN SQLite默認情況下禁用外鍵約束(爲了向後兼容)。您必須在與數據庫建立連接後,明確使用

PRAGMA foreign_keys = 1 。這裏是官方文檔的鏈接,可以更深入地解釋它。 http://sqlite.org/foreignkeys.html請導航到在上面的鏈接中啓用外鍵支持。