Mam tabeli SQLite:Dlaczego InsertWithOnConflict (..., CONFLICT_IGNORE) zwraca -1 (błąd)?
CREATE TABLE regions (_id INTEGER PRIMARY KEY, name TEXT, UNIQUE(name));
a niektóre kodu Androida:
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);
Na zduplikowanych wierszy insertWithOnConflict() zwraca -1, wskazujący na błąd, a następnie wyrzuca z Validate:
INSERT ON CONFLICT IGNORE returned -1 for region name 'Overseas'
Numer SQLite ON CONFLICT documentation (podkreślenie):
Gdy ma miejsce naruszenie ograniczenia, algorytm rozwiązywania IGNORE pomija jeden wiersz zawierający naruszenie ograniczenia i kontynuuje przetwarzanie kolejnych wierszy instrukcji SQL, tak jakby nic się nie stało. Pozostałe wiersze przed i po wierszu zawierającym naruszenie ograniczenia są wstawiane lub aktualizowane normalnie. Nie jest zwracany błąd, gdy używany jest algorytm rozwiązywania konfliktów IGNORE.
W Android insertWithOnConflict() documentation stanowi:
Zwraca jak identyfikator wiersz wstawianego wiersza lub klucz pierwotny istniejących rzędu jeśli param wejście „conflictAlgorithm” = CONFLICT_IGNORE lub -1 jakiegokolwiek błędu
CONFLICT_REPLACE nie jest opcją, ponieważ wymiana wiersze będą zamiast zmienić swój podstawowy klucz prostu powrocie istniejący klucz:
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
myślę że insertWithOnConflict() powinny na zduplikowane wiersze, wróć mi klucz podstawowy (kolumna _id) z duplikatu rzędu — więc mam nigdy komunikat o błędzie dla tej wkładki. Dlaczego insertWithOnConflict() zgłasza błąd? Jaką funkcję muszę wywołać, aby zawsze uzyskać prawidłowy identyfikator rzędu?
Sprawdź swój LogCat. Ponieważ otrzymujesz kod błędu, powinieneś zobaczyć kilka ostrzeżeń z SQLite. – Sam
OK, to nie to - Naprawiłem "nie mam blokady bazy danych!", Ale nadal dostaję błąd. Zrzut ekranu dziennika pod adresem http://i.imgur.com/KIlWH.png. – George