sql >> Database >  >> RDS >> SQLite

Android SQLite invoegen of bijwerken

Ik denk dat je vraagt ​​hoe je nieuwe rijen INSERT of je bestaande rijen BIJWERKT in één stap. Hoewel dat mogelijk is in een enkele onbewerkte SQL, zoals besproken in dit antwoord, vond ik dat het gemakkelijker was om dit in twee stappen in Android te doen met SQLiteDatabase.insertWithOnConflict() met CONFLICT_IGNORE voor conflictAlgorithm.

ContentValues initialValues = new ContentValues();
initialValues.put("_id", 1); // the execution is different if _id is 2
initialValues.put("columnA", "valueNEW");

int id = (int) yourdb.insertWithOnConflict("your_table", null, initialValues, SQLiteDatabase.CONFLICT_IGNORE);
if (id == -1) {
    yourdb.update("your_table", initialValues, "_id=?", new String[] {"1"});  // number 1 is the _id here, update to variable for your code
}

In dit voorbeeld wordt ervan uitgegaan dat de tabelsleutel is ingesteld voor kolom "_id", dat u de record _id kent en dat er al rij #1 is (_id=1, columnA ="valueA", columnB ="valueB"). Hier is het verschil met insertWithOnConflict met CONFLICT_REPLACE en CONFLICT_IGNORE

  • CONFLICT_REPLACE zal bestaande waarden in andere kolommen overschrijven naar null (dwz kolomB wordt NULL en het resultaat is _id=1, columnA ="valueNEW", columnB =NULL). Je verliest bestaande gegevens als resultaat en ik gebruik het niet in mijn code.
  • CONFLICT_IGNORE slaat de SQL INSERT voor uw bestaande rij #1 over en u zult deze rij in de volgende stap SQL-UPDATE waarbij de inhoud van alle andere kolommen behouden blijft (dwz het resultaat is _id=1, columnA ="valueNEW", kolomB ="waardeB").

Wanneer u nieuwe rij #2 probeert in te voegen die nog niet bestaat, zal de code alleen de SQL INSERT uitvoeren in de eerste instructie insertWithOnConflict (dwz het resultaat is _id=2, columnA ="valueNEW", columnB =NULL).

Pas op voor deze bug die ervoor zorgt dat SQLiteDatabase.CONFLICT_IGNORE niet goed werkt op API10 (en waarschijnlijk API11). De query retourneert 0 in plaats van -1 wanneer ik test op Android 2.2.

Als u de recordsleutel _id niet weet of als u een voorwaarde heeft die geen conflict veroorzaakt, kunt u de logica omkeren naar UPDATE of INSERT . Hierdoor blijft uw recordsleutel _id behouden tijdens UPDATE of maakt u een nieuwe record _id tijdens INSERT.

int u = yourdb.update("yourtable", values, "anotherID=?", new String[]{"x"});
if (u == 0) {
    yourdb.insertWithOnConflict("yourtable", null, values, SQLiteDatabase.CONFLICT_REPLACE);
}

In het bovenstaande voorbeeld wordt ervan uitgegaan dat u bijvoorbeeld de tijdstempelwaarde in de record wilt UPDATEN. Als u eerst insertWithOnConflict aanroept, zal INSERT een nieuwe record _id maken vanwege het verschil in de tijdstempel.



  1. Hoe selecteer ik alle records uit de ene tabel die niet in een andere tabel voorkomen?

  2. Hoe SUBDATE() werkt in MariaDB

  3. SQL Server Collection Inventory Script -3

  4. Inleiding tot SQL-opdrachten