sqlite约束失败错误代码

时间:2010-07-30 12:19:15

标签: android sqlite constraints

我有两张桌子专辑和歌曲,每首歌都提到了明矾的身份。

相册表:

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的相册。坏的是我无法重现这个,所以我没有提供太多的信息。 我尝试了删除相册的不同场景,但我从未遇到过此例外。

所以任何想法如何调查此问题。专辑表中没有任何约束因此可能导致此类异常?任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

这太不公平了。如果你在PC上运行这个代码一切都很好,如果你试图删除有歌曲的专辑,例外说:专辑有歌曲无法删除“但似乎android家伙没有处理来自sqlite和jsut抛出的正确RAISE异常: android.database.sqlite.SQLiteConstraintException:错误代码19:约束失败。

答案 1 :(得分:2)

我通过将数据库的定义更正为NOT NULL字段来解决这个问题。您必须发送一些数据。

答案 2 :(得分:1)

我在背景中有一些触发器有同样的问题,我终于切换到这个经典选项,它解决了我的问题:

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

答案 3 :(得分:0)

另请参阅“SQLiteStatement不会传播SQLite触发器中定义的错误消息”  http://code.google.com/p/android/issues/detail?id=3296

相关问题