Android: SQLite - insertWithOnConflict

8

Ich rufe insertWithOnConflict mit SQLiteDatabase.CONFLICT_IGNORE auf. Wenn jedoch ein Konflikt auftritt, wird anstelle der ID der bestehenden Zeile "-1" zurückgegeben. Wie korrigiere ich das?

Tabellenerstellung:

BEARBEITEN:

%Vor%

Anweisung einfügen:

%Vor%     
meeeee 11.09.2012, 02:20
quelle

5 Antworten

9

insertWithOnConflict, die Verwendung von SQLiteDatabase.CONFLICT_IGNORE funktioniert nicht wie erwartet und sollte laut diesem Problem wahrscheinlich ganz vermieden werden:
Ссылка

    
Tom 18.04.2013 17:24
quelle
1

Android erwartet, dass die Primärschlüsselspalte _id heißt. Könnte die Ursache sein: Da die Spalte nicht existiert, kann sie den Wert nicht zurückgeben und gibt -1 zurück.

    
znat 11.09.2012 02:40
quelle
1

SQLiteDatabase.CONFLICT_IGNORE-Kommentar soll genauso funktionieren, wie Sie es beobachtet haben. Bei dem Versuch, einzufügen, wenn keine Zeile in Konflikt ist, wird eine neue Zeile mit den angegebenen Werten eingefügt und die ID der neu eingefügten Zeile zurückgegeben. Wenn andererseits bereits eine Zeile mit einem Konflikt vorliegt (mit demselben eindeutigen Schlüssel), werden die eingehenden Werte ignoriert, und die vorhandene Zeile wird beibehalten, und der Rückgabewert wird -1 sein, um auf ein Konfliktszenario hinzuweisen. Um weitere Details zu erfahren und zu verstehen, wie man mit diesem Rückgabewert umgeht, lesen Sie bitte Android / SQLite: Einfügen - Tabellenspalten aktualisieren, um den Bezeichner beizubehalten

    
tony m 15.04.2013 12:07
quelle
1

Die von mir verwendete Problemumgehung verwendet insertOrThrow anstelle von insertWithOnConflict und explizit SQLiteConstraintException . Sie müssen es explizit abfangen, da es von RuntimeException erbt.

Ich musste diese Problemumgehung verwenden, weil insert das Datenbankschema bei einem Konflikt in den Protokollen gespeichert hat, und das war inakzeptabel.

    
Ariel Cabib 10.11.2014 17:55
quelle
0
%Vor%

Ich bin immer noch in der Lage, die Zeile in die Datenbank eingefügt, die CONFLICT_IGNORE funktioniert nicht wie erwartet @ Tom ist richtig, aber ich bin mir nicht sicher, ob das Problem behoben wurde

    
user2664843 08.08.2013 14:35
quelle

Tags und Links