SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Sisipkan atau Perbarui SQLite Android

Saya yakin Anda bertanya bagaimana cara MASUKKAN baris baru atau PERBARUI baris yang ada dalam satu langkah. Meskipun itu mungkin dalam satu SQL mentah seperti yang dibahas dalam jawaban ini, saya menemukan bahwa lebih mudah untuk melakukan ini dalam dua langkah di Android menggunakan SQLiteDatabase.insertWithOnConflict() menggunakan CONFLICT_IGNORE untuk 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
}

Contoh ini mengasumsikan bahwa kunci tabel disetel untuk kolom "_id", bahwa Anda mengetahui record _id, dan bahwa sudah ada baris #1 (_id=1, columnA ="valueA", columnB ="valueB"). Berikut perbedaan menggunakan insertWithOnConflict dengan CONFLICT_REPLACE dan CONFLICT_IGNORE

  • CONFLICT_REPLACE akan menimpa nilai yang ada di kolom lain menjadi nol (mis. kolomB akan menjadi NULL dan hasilnya akan menjadi _id=1, kolomA ="nilaiBARU", kolomB =NULL). Akibatnya, Anda kehilangan data yang ada dan saya tidak menggunakannya dalam kode saya.
  • CONFLICT_IGNORE akan melewatkan SQL INSERT untuk baris #1 Anda yang ada dan Anda akan SQL UPDATE baris ini pada langkah berikutnya dengan mempertahankan konten semua kolom lainnya (yaitu, hasilnya adalah _id=1, columnA ="valueNEW", kolomB ="nilaiB").

Saat Anda mencoba memasukkan baris baru #2 yang belum ada, kode hanya akan mengeksekusi SQL INSERT di pernyataan pertama insertWithOnConflict (yaitu, hasilnya adalah _id=2, columnA ="valueNEW", columnB =NULL).

Waspadalah terhadap bug ini yang menyebabkan SQLiteDatabase.CONFLICT_IGNORE tidak berfungsi pada API10 (dan mungkin API11). Kueri mengembalikan 0 alih-alih -1 saat saya menguji di Android 2.2.

Jika Anda tidak mengetahui _id kunci record atau Anda memiliki kondisi yang tidak akan membuat konflik, Anda dapat membalikkan logika ke UPDATE atau INSERT . Ini akan menyimpan _id kunci catatan Anda selama UPDATE atau membuat _id catatan baru selama INSERT.

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

Contoh di atas mengasumsikan bahwa Anda hanya ingin UPDATE nilai stempel waktu dalam catatan misalnya. Jika Anda memanggil insertWithOnConflict terlebih dahulu, INSERT akan membuat record _id baru karena perbedaan kondisi timestamp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menghapus item dari database sqlite dengan kelas SQLiteOpenHelper

  2. Cara menutup kursor dengan benar di android

  3. Tambahkan Hari ke Tanggal di SQLite

  4. 2 Cara Menyisipkan Baris Baru ke dalam String di SQLite

  5. Hapus SQLite