SQLiteDatabase.insertWithOnConflict抛出异常。它不应该

时间:2014-11-10 12:45:44

标签: android sqlite android-sqlite conflict

我正在使用Android应用程序,有时我需要使用来自服务器的一些数据来更新SQLite数据库。

我尝试插入的数据可能会发生冲突,因为已存在具有相同主键的行。这就是我使用 insertWithOnConflict CONFLICT_IGNORE 标志的原因。这个想法是"如果没有数据存储它,如果它已经存在则只需忽略并继续前进"。

然而,当发生冲突时,我发现我的应用程序因此异常而崩溃:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.novadart.booster.android, PID: 1643
    android.database.sqlite.SQLiteConstraintException: foreign key constraint failed (code 19)
            at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
            at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
            at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
            at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)

为什么文档说不应该抛出异常?是一个错误还是我错过了什么?

例如,如果我使用 insert ,我可以在日志中看到相同的例外但应用程序不会崩溃(该方法返回-1,那就是它)。

1 个答案:

答案 0 :(得分:1)

问题是我插入的行违反了外键约束(引用的行不存在)。出于某种原因,我忽略了这一点。

所以,它不是insertOnConflict的错。