2016-09-01 4 views
0

Ich habe eine SQLite-Tabelle wie folgt aus:Einfügen oder Aktualisieren von SQLite-Tabelle in Abhängigkeit von id

CREATE TABLE test (id int PRIMARY KEY, Name text, Country text, ..., ...) 

I-Daten für diese Tabelle immer bin, dass die Spaltenwerte geändert, mit Ausnahme der id haben. Also, ich möchte einfügen, wenn dort nicht eine bestimmte id drin ist, aber ich möchte den Datensatz mit dem id mit den neuen Werten aktualisieren.

Ich habe dies versucht:

INSERT OR IGNORE INTO test (id, Name, ..., ...) VALUES (?,?, ....)" 

Dies keine doppelten id's schafft - und das ist gut - aber der Rest des Datensatz nicht aktualisiert, wenn entweder die id existiert bereits in der Tabelle.

Ich möchte vermeiden, SELECT für diese id verwenden und überprüfen, ob es da ist, dann aktualisieren oder entsprechend einfügen.

Antwort

1

Sie könnten versuchen, INSERT OR REPLACE zu verwenden. Dies wird versuchen, die Zeile zuerst einzufügen, und wenn es einen Konflikt mit der id gibt, wird es die alte Zeile löschen und die Einfügung erneut versuchen.

INSERT OR REPLACE hat den Nachteil, dass Sie bei jeder "upsert" -Operation alle Felder der Zeile angeben müssen. Wenn dies für Sie nicht funktioniert, dann ist die einzige Alternative ein SELECT, gefolgt von einem INSERT oder einem UPDATE. Du hast gesagt, dass du das nicht magst, aber in sqlite ist das nicht so schlimm wie bei anderen RDBMS; sqlite ist ein eingebettetes RDBMS und kein Client-Server-RDBMS, und daher sind die mit der Durchführung solcher Operationen verbundenen Kosten viel geringer. Vergessen Sie nicht, die beiden Operationen in eine Transaktion zu integrieren.

+0

Ja, ich möchte 'SELECT' vermeiden und dann' INSERT' oder 'UPDATE' auf die je Ergebnis des 'SELECT'. @CL schlägt eine Lösung vor, die ich auch anderswo gesehen habe: eine Zeile mit dieser spezifischen 'id' zu aktualisieren, die funktioniert, wenn die 'id' da ist, und wenn keine Aktualisierung gemacht wurde, bedeutet das, dass ich 'INSERT' machen muss . Aber es ist immer noch eine Zwei-Abfrage-Lösung. Ich weiß nicht, was schneller ist, aber – chiapa

+0

Ich denke, "INSERT OR REPLACE" ist die einzige One-Step-Lösung. Darf ich fragen, warum Sie so eine Abneigung gegen 2 Operationen haben? Lassen Sie mich noch einmal sagen, dass Sie in sqlite als eingebettete Lösung nicht die Kosten bezahlen müssen, die Sie mit herkömmlichen Client-Server-RDBMS bezahlen würden, da es keinen Rundlauf durch den Netzwerkstapel, keine Kontextwechsel usw. gibt – redneb

+0

Keine Aversion, wollte nur unnötige Operationen und Overhead vermeiden. In T-SQL würde ich zwei Operationen vermeiden, wenn ich eine verwenden könnte, da die Leistung beeinträchtigt wäre – chiapa

1

Sie könnten nur versuchen, das Update und wenn keine Aufzeichnung tatsächlich aktualisiert wurde, führen Sie die INSERT:

ContentValues cv = new ContentValues(); 
cv.put("Name", ...); 
if (db.update("test", cv, "id = " + myID, null) < 1) { 
    cv.put("id", myID); 
    db.insert("test", null, cv); 
} 
Verwandte Themen