Android: SQLite - insertWithOnConflict
Rufe ich insertWithOnConflict, mit SQLiteDatabase.CONFLICT_IGNORE. Jedoch, wenn ein Konflikt Auftritt, "-1" zurückgegeben, anstatt die id der vorhandenen Zeile. Wie kann ich das korrigieren?
Erstellung der Tabelle:
EDIT :
String CREATE_CATEGORY_TABLE = "CREATE TABLE "+TABLE_CATEGORY+"(" +
BaseColumns._ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
KEY_CATEGORY_NAME+" TEXT UNIQUE" +
")";
db.execSQL(CREATE_CATEGORY_TABLE);
Insert-Anweisung:
ContentValues values = new ContentValues();
values.put(KEY_CATEGORY_NAME, name);
int catID = (int) db.insertWithOnConflict(TABLE_CATEGORY, null, values, SQLiteDatabase.CONFLICT_IGNORE);
- Ein Rückgabewert von -1 bedeutet, dass ein Fehler aufgetreten ist. Tut es auch -1 zurückgeben, wenn Sie legen Sie eine eindeutige (nicht-widersprüchlichen) Zeile?
- Borland : Nein. Ein nicht kollidierende insert wird wieder die richtige Zeile id.
Du musst angemeldet sein, um einen Kommentar abzugeben.
insertWithOnConflict, mit SQLiteDatabase.CONFLICT_IGNORE funktioniert nicht wie erwartet, und wahrscheinlich sollte vermieden werden, da pro dieser Ausgabe:
https://code.google.com/p/android/issues/detail?id=13045
SQLiteDatabase.CONFLICT_IGNORE Kommentar soll die Funktion die gleiche Weise, wie Sie beobachtet hatte. Beim Versuch zu legen, wenn es keine widersprüchlichen Zeile, dann wird eine neue Zeile eingefügt werden mit den gegebenen Werten und Rückgabe die id der neu eingefügten Zeile. Auf der anderen Seite gibt es bereits eine widersprüchliche Zeile (mit den gleichen eindeutigen Schlüssel), dann die ankommenden Werte werden ignoriert und der bestehenden Zeile wird beibehalten und dann die return-Wert -1, um anzuzeigen, dass ein Konflikt-Szenario. Näheres wissen und zu verstehen, wie man diesem Wert zurückgeben, Lesen Sie bitte Android/SQLite: Insert-Update-Tabelle-Spalten an, halten Sie die Kennung
Android erwartet, dass die primary key-Spalte aufgerufen werden
_id
. Könnte das die Ursache sein: da die Spalte nicht vorhanden ist, es nicht zurückgeben können, den Wert und gibt den Wert -1 zurück.Den workaround, den ich verwendet ist mit
insertOrThrow
stattinsertWithOnConflict
, und explizit FangSQLiteConstraintException
. Sie müssen explizit zu fangen, weil es erbt vonRuntimeException
.Hatte ich um diese Problemumgehung zu verwenden, weil
insert
wurde ein Speicherauszug der Datenbank-Schema, um die Protokolle, wenn es einen Konflikt gab, und das war inakzeptabel.Ich bin immer noch in der Lage, um die Zeile in die Datenbank eingefügt, die CONFLICT_IGNORE funktioniert nicht wie erwartet, @Tom ist schon richtig, aber ich bin nicht sicher, ob das Problem wurde behoben,