Ich habe eine SQLite-Tabelle:Warum gibt InsertWithOnConflict (..., CONFLICT_IGNORE) -1 (Fehler) zurück?
CREATE TABLE regions (_id INTEGER PRIMARY KEY, name TEXT, UNIQUE(name));
und einige Android-Code:
Validate.notBlank(region);
ContentValues cv = new ContentValues();
cv.put(Columns.REGION_NAME, region);
long regionId =
db.insertWithOnConflict("regions", null, cv, SQLiteDatabase.CONFLICT_IGNORE);
Validate.isTrue(regionId > -1,
"INSERT ON CONFLICT IGNORE returned -1 for region name '%s'", region);
Auf doppelte Zeilen insertWithOnConflict() -1 Rückkehr, einen Fehler anzeigt, und Validate dann wirft mit:
INSERT ON CONFLICT IGNORE returned -1 for region name 'Overseas'
Die SQLite ON CONFLICT documentation (Hervorhebung von mir) heißt es:
Wenn eine anwendbare Einschränkungsverletzung auftritt, überspringt der IGNORE-Auflösungsalgorithmus die eine Zeile, die die Einschränkungsverletzung enthält, und verarbeitet die nachfolgenden Zeilen der SQL-Anweisung weiter, als ob nichts schief gelaufen wäre. Andere Zeilen vor und nach der Zeile, die die Einschränkungsverletzung enthielt, werden normal eingefügt oder aktualisiert. Wenn der Konfliktlösungsalgorithmus IGNORE verwendet wird, wird kein Fehler zurückgegeben.
Die Android insertWithOnConflict() documentation Zustände:
Returns die Zeilen ID der neu eingefügte Zeile oder der Primärschlüssel der vorhandenen Zeile, wenn das Eingang param ‚conflictAlgorithm‘ = CONFLICT_IGNORE oder -1 wenn ein Fehler
CONFLICT_REPLACE ist keine Option, weil ersetzen Reihen ihre Primärschlüssel statt ändern nur den vorhandenen Schlüssel Rückkehr:
sqlite> INSERT INTO regions (name) VALUES ("Southern");
sqlite> INSERT INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
2|Overseas
sqlite> INSERT OR REPLACE INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
3|Overseas
sqlite> INSERT OR REPLACE INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
4|Overseas
Ich denke, dass insertWithOnConflict() soll auf doppelte Zeilen, kehrt mir den Primärschlüssel (_id Spalte) der doppelten Zeile — so soll ich nie einen Fehler für diesen Einsatz erhalten. Warum gibt insertWithOnConflict() einen Fehler aus? Welche Funktion muss ich anrufen, damit ich immer eine gültige Zeilen-ID zurückbekomme?
Überprüfen Sie Ihre LogCat. Da Sie einen Fehlercode erhalten, sollten Sie einige Warnungen von SQLite sehen. – Sam
OK, das ist es nicht - ich habe die festen „nicht Datenbank-Sperre hat!“, Aber ich habe noch den Fehler. Screenshot des Logs unter http://i.imgur.com/KIlWH.png. – George