代码之家  ›  专栏  ›  技术社区  ›  Mojo Risin

sqlite约束失败错误代码

  •  4
  • Mojo Risin  · 技术社区  · 14 年前

    我有两张桌子专辑和歌曲,每首歌都参考了校友的身份证。

    相册表:

    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 回复  |  直到 14 年前
        1
  •  2
  •   Mojo Risin    14 年前

    这太不公平了。如果你在PC上运行此代码,一切正常,如果你尝试删除包含歌曲的专辑,异常会显示:专辑包含无法删除的歌曲“但似乎android的家伙无法处理来自sqlite和jsut的正确提升异常:android.database.sqlite.SQLiteConstraintException:错误代码19:约束失败。

        2
  •  2
  •   blahman Manav    13 年前

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

        3
  •  1
  •   Youyougoslave    13 年前

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

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