SQLite约束失败错误代码

4

我可以帮助您翻译。需要翻译的内容涉及IT技术,并与两张表albums和songs有关,每个歌曲都引用了专辑的ID。

专辑表:


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删除相册。不好的是我无法复现此问题,因此我无法提供太多信息。我尝试了不同的相册删除场景,但从未遇到过此异常。

那么有什么想法可以调查此问题吗?相册表中没有任何限制,那么什么可能导致这样的异常?任何帮助将不胜感激。


首先,我建议您下载SQLite数据库浏览器。该软件提供了从模拟器导出查询后测试其的可能性。这样,您可以检查是否存在任何错误。此外,在您提出函数之后,您有一个;但似乎它会在中间截断您的查询,因为它后面跟着一个where。 - Sephy
第一次创建表格时,是否像您在帖子中所述那样没有任何约束条件?如果您第一次运行时使用了约束条件,则会创建该表。然后,如果您删除约束条件并重新运行项目,则不会重新创建该表(如果只使用getWrtiableDatabase()),您将拥有旧版本(带有约束条件)。因此,您必须首先将其删除。 - ccheneson
4个回答

2

这太不公平了。如果你在电脑上运行此代码,一切都正常,但如果你尝试删除包含歌曲的专辑,则会出现异常:“无法删除专辑,因为该专辑有歌曲”,但似乎安卓开发人员没有正确处理sqlite中的RAISE并且只是抛出异常:android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed。


2

我通过更正数据库的定义为非空字段来解决了这个问题。你必须发送一些数据。


1

我遇到了一些后台触发器的同样问题,但最终我切换到了这个经典选项,解决了我的问题:

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接