SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Chèn hoặc cập nhật SQLite cho Android

Tôi tin rằng bạn đang hỏi cách CHÈN hàng mới hoặc CẬP NHẬT các hàng hiện có của bạn trong một bước. Mặc dù điều đó có thể thực hiện được trong một SQL thô như đã thảo luận trong câu trả lời này, nhưng tôi thấy rằng việc thực hiện điều này trong hai bước trong Android dễ dàng hơn bằng cách sử dụng SQLiteDatabase.insertWithOnConflict () bằng CONFLICT_IGNORE cho xung đột.

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
}

Ví dụ này giả định rằng khóa bảng được đặt cho cột "_id", mà bạn biết bản ghi _id và đã có hàng # 1 (_id =1, columnA ="valueA", columnB ="valueB"). Đây là sự khác biệt khi sử dụng insertWithOnConflict với CONFLICT_REPLACE và CONFLICT_IGNORE

  • CONFLICT_REPLACE sẽ ghi đè các giá trị hiện có trong các cột khác thành null (tức là columnB sẽ trở thành NULL và kết quả sẽ là _id =1, columnA ="valueNEW", columnB =NULL). Do đó, bạn sẽ mất dữ liệu hiện có và tôi không sử dụng dữ liệu đó trong mã của mình.
  • CONFLICT_IGNORE sẽ bỏ qua CHÈN SQL cho hàng hiện có số 1 của bạn và bạn sẽ CẬP NHẬT SQL hàng này trong bước tiếp theo để bảo toàn nội dung của tất cả các cột khác (tức là kết quả sẽ là _id =1, columnA ="valueNEW", cộtB ="giá trịB").

Khi bạn cố gắng chèn hàng # 2 mới chưa tồn tại, mã sẽ chỉ thực thi SQL INSERT trong câu lệnh đầu tiên insertWithOnConflict (tức là kết quả sẽ là _id =2, columnA ="valueNEW", columnB =NULL).

Hãy cẩn thận với lỗi này đang gây ra sự cố SQLiteDatabase.CONFLICT_IGNORE trên API10 (và có thể là API11). Truy vấn trả về 0 thay vì -1 khi tôi kiểm tra trên Android 2.2.

Nếu bạn không biết khóa ghi _id hoặc bạn có điều kiện không tạo ra xung đột, bạn có thể đảo ngược logic thành CẬP NHẬT hoặc CHÈN . Thao tác này sẽ giữ _id bản ghi của bạn trong khi CẬP NHẬT hoặc tạo một _id bản ghi mới trong khi INSERT.

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

Ví dụ trên giả định rằng bạn chỉ muốn CẬP NHẬT giá trị dấu thời gian trong bản ghi chẳng hạn. Nếu bạn gọi insertWithOnConflict trước, INSERT sẽ tạo bản ghi mới _id do sự khác biệt trong điều kiện dấu thời gian.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqliteLog 14:không thể mở tệp tại dòng

  2. Làm cách nào để truy xuất tất cả các hàng trong DB của tôi?

  3. Làm thế nào để đồng bộ hóa với cơ sở dữ liệu cục bộ và phân tích cú pháp?

  4. Truy cập cơ sở dữ liệu của một ứng dụng từ một ứng dụng khác

  5. Cách hoạt động của SQLite Length ()