2010-07-30 166 views
4

我有兩張表格專輯和歌曲,每首歌都有引用alum的id。sqlite約束失敗錯誤代碼

專輯表:

CREATE TABLE albums 
(id INTEGER PRIMARY KEY ASC, 
name TEXT, 
additional TEXT) 

宋表:

CREATE TABLE songs 
(id INTEGER PRIMARY KEY ASC, 
album_fk INTEGER NOT NULL, 
title TEXT, 
url TEXT, 
duration BIGINT NOT NULL) 

,我也有一個觸發器來檢查時,我是否有它存在的歌曲刪除相冊:

CREATE TRIGGER trigger_on_delete 
BEFORE DELETE ON albums 
FOR EACH ROW BEGIN 
SELECT RAISE(FAIL,'album has songs cannot be deleted') 
WHERE (SELECT album_fk FROM songs WHERE album_fk = OLD.id) IS NOT 
NULL;) 
END 

這一切工作正常,但有時

Exception: android.database.sqlite.SQLiteConstraintException: error 
code 19: constraint failed 
Stack Trace : 
android.database.sqlite.SQLiteStatement.native_execute(Native Method) 
android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java: 
66) 

當我嘗試刪除相冊時被拋出。我的刪除方法是簡單地刪除一個相冊的ID。壞的一面是,我無法重現這一點,所以沒有太多的信息,我可以提供。 我嘗試了刪除專輯的不同場景,但我從來沒有得到這個例外。

所以任何想法如何可以調查這個問題。專輯表中沒有任何限制,因此可能會導致此類異常?任何幫助將不勝感激。

+0

首先,我會建議你下載SQLite數據庫瀏覽器。該軟件提供了在從模擬器中導出它們之後測試您的查詢的可能性。這樣你可以檢查是否有任何錯誤。而且,在你提出功能之後,你有一個;但它似乎在middl中減少了您的查詢,因爲它後面跟着一個 – Sephy 2010-07-30 12:42:57

+0

第一次創建表時,是否沒有任何限制,因爲它在您的文章中?如果您第一次運行約束條件,將創建表格。然後,如果您刪除約束條件並重新運行項目,則表格將不會被重新創建(如果您只是使用getWrtiableDatabase()),並且您將擁有舊版本(帶約束條件)。所以你必須先刪除它。 – ccheneson 2010-07-30 14:18:50

回答

2

這太不公平了。如果你在電腦上運行這段代碼,一切正常,如果你試圖刪除有歌曲的專輯,例外說:專輯有歌曲不能刪除「但似乎Android的人不處理從SQLite和Jsut正確的RAISE拋出異常: android.database.sqlite.SQLiteConstraintException:錯誤代碼19:約束失敗

1

我有同樣的問題,在一些backgroung觸發器,我終於切換到這個經典的選項,它修復了我的問題:

db.rawQuery(「UPDATE table set column = newValue WHERE ...;「,null);

2

我解決了這個問題,將我的數據庫的定義更正爲一個不爲NULL的字段。你必須發送一些數據。

相關問題