2012-03-05 61 views
10

Tôi phải viết truy vấn trong sqlite để cập nhật bản ghi nếu nó tồn tại hoặc chèn nó nếu bản ghi không tồn tại. Tôi đã xem cú pháp của INSERT OR REPLACE INTO từ here. Nhưng trong trường hợp của tôi, khi tôi thực hiện truy vấn dưới đây nhiều lần bản ghi được nhân đôi. tức là nếu tôi thực hiện truy vấn 5 lần, bản ghi được chèn 5 lần.SQLite "INSERT HOẶC REPLACE INTO" không hoạt động

INSERT OR REPLACE INTO NICKS 
    (id_nick,name_nick,date_creation) 
VALUES 
    ('nabeelarif', 'Muhammad Nabeel','2012-03-04') 

Bạn có biết tôi đang làm gì sai không. Tôi đang làm việc trên nền tảng Android và sử dụng 'Firefox Sqlite Manager' để kiểm tra truy vấn của mình.

Trả lời

25

Bạn cần có chỉ mục duy nhất trên một hoặc kết hợp các cột đó.

CREATE UNIQUE INDEX idx_something ON NICKS (id_nick, name_nick, date_creation);

+0

Cảm ơn bạn. Tôi đã tạo chỉ mục duy nhất trên 'id_nick' và nó hoạt động. –

+0

Tôi cũng tạo ra một nhưng dường như không làm việc, bạn có thể cung cấp cái nhìn sâu sắc hơn? – Skynet

3

Bạn có khóa chính hoặc chỉ mục duy nhất được xác định cho bảng của mình không? Tôi tin rằng các thuộc tính tạo nên khóa chính hoặc chỉ mục duy nhất được sử dụng để xác định xem một hàng đã tồn tại hay chưa.

6

Trong Android, bạn nên sử dụng SQLiteDatabase.replace(), tính năng này sẽ chèn hoặc cập nhật. Với việc triển khai SQLite trên Android, bạn thường không sử dụng truy vấn thô được biểu diễn dưới dạng chuỗi. Xem http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#replace%28java.lang.String,%20java.lang.String,%20android.content.ContentValues%29

+0

tuyệt vời, cảm ơn rất nhiều! +1 – Dori

+0

Rất vui được giúp! – Macondo2Seattle

-2

Tôi thường sử dụng mã này cho rằng:

Cursor cur = mDatabase.rawQuery("select * from NICKS where id_nick='"+id_nick+"'); 
cur.moveToFirst(); 
if(cur.getCount()>0){ 
    update... 
}else{ 
    insert... 
} 
Các vấn đề liên quan