2010-07-30 168 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的字段。你必须发送一些数据。

相关问题