2011-11-02 34 views
30

Tôi cần thực hiện thủ tục INSERT hoặc UPDATE IF EXIST với cơ sở dữ liệu của mình. Tôi đọc rằng .replace() là con đường để đi. Nó chèn hồ sơ mới tốt, nhưng nếu bản ghi đã tồn tại, nó không xuất hiện để cập nhật nó.Android SQLite - SQLiteDatabase.replace() thực sự làm gì?

Tôi có một cái gì đó như thế này:

ContentValues values = new ContentValues(); 
values.put(ID, 1); 
values.put(NAME, "bob"); 
values.put(VISIBLE, true); 
db.replace("peopleTable", null, values); 

Nếu tôi chạy mã này khi hồ sơ này không có trong cơ sở dữ liệu, nó xuất hiện để tạo bản ghi tốt, như thể tôi đã làm một insert(). Nhưng nếu tôi thay đổi NAME thành "john" hoặc một cái gì đó như thế, và chạy lại replace(), nó không xuất hiện để cập nhật bản ghi.

Theo các tài liệu, đây là cú pháp:

public long replace (String table, String nullColumnHack, ContentValues initialValues) 

Tại sao lại gọi là initalValues? Điều đó có nghĩa là các giá trị đó chỉ được sử dụng khi bản ghi không tồn tại và nó sẽ được chèn vào? Nếu vậy, làm thế nào để bạn sử dụng phương pháp để cập nhật một bản ghi? Bạn chỉ định giá trị mới ở đâu?

Nếu tôi hiểu nhầm replace() là gì, ai đó có thể giải thích mục đích của nó là gì?

+1

Nó INSERT OR REPLACE. –

+2

Bạn có thể sử dụng cả hai thủ tục 'INSERT' và' REPLACE' trong các phương thức 'ContentProvider.insert()' nếu bạn chuyển một tham số đặc biệt trong 'ContentValues' của bạn. Tôi đã viết một bài đăng blog về nó ở đây: [SQLite INSERT OR REPLACE thông qua ContentProvider | Buzzing Android] (http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/) – JesperB

Trả lời

29

Khi tôi hiểu nó replace() hoạt động giống như từ khóa REPLACE của SQLite - một hàng sẽ được cập nhật nếu xảy ra vi phạm ràng buộc duy nhất cho chèn. Vì vậy, cột ID trong ví dụ của bạn sẽ cần phải có một ràng buộc PRIMARY KEY trong lược đồ cơ sở dữ liệu cho hàng sẽ được cập nhật.

+0

Tôi nghĩ rằng đó có thể là vấn đề. –

+0

Trước hết, có trường "_id" là khóa CHÍNH. Thứ hai, hồ sơ mới không được tạo ra. Điều này có nghĩa là phương pháp trên thực tế là tìm bản ghi gốc và không tạo bản ghi mới. Nhưng như tôi đã nói, bản ghi hiện tại không được cập nhật ... –

+2

Vâng, để trích dẫn bài đăng blog của @ JesperB - "Như bạn có thể thấy trong tài liệu chính thức (SQL As Understood By SQLite), lệnh thực hiện một INSERT OR Đó là, làm một INSERT và nếu INSERT đó không thành công do xung đột, hãy xóa các hàng xung đột trước khi INSERT một lần nữa. " –

3

Phương thức replace() thực sự thực thi lệnh sql insert or replace into (...) values (...)

Các vấn đề liên quan