I'm working on an Android app and from time to time I need to update the SQLite database with some data coming from the server.
It might happen that the data that I'm trying to insert generates conflicts, because a row with the same primary key is already present. This is why I am using insertWithOnConflict with the CONFLICT_IGNORE flag. The idea is "if the data is not present store it, if it is already present just ignore and move on".
However when a conflict happens I see that my app crashes with this exception:
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)
why an exception when documentation says that it should not be thrown? Is is a bug or am I missing something?
If, for example, I use insert I can see the same exceptions in the logs but the app does not crash (the method returns -1 and that's it).
the problem was that the row I was inserting was violating a foreign key constraint (the referenced row did not exist). For some reason I overlooked that.
So, it is not insertOnConflict's fault.