2012-03-05 4 views
10

Мне нужно написать запрос в sqlite, чтобы обновить запись, если она существует, или вставить ее, если запись еще не существует. Я посмотрел синтаксис INSERT OR REPLACE INTO от here. Но в моем случае, когда я выполняю запрос ниже много раз, запись дублируется. i.e Если я выполнил запрос 5 раз, запись будет вставлена ​​5 раз.SQLite «INSERT OR REPLACE INTO» не работает

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

Вы знаете, что я делаю неправильно. Я работаю на платформе Android и использую 'Firefox Sqlite Manager' для проверки моего запроса.

ответ

25

Вам нужно иметь уникальный индекс на одном или в сочетании этих столбцов.

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

+0

Спасибо. Я создал уникальный индекс на id_nick, и он сработал. –

+0

Я также создал один, но, похоже, не работает, можете ли вы представить больше понимания? – Skynet

3

У вас есть первичный ключ или уникальный индекс, определенный для таблицы? Я считаю, что атрибуты, составляющие первичный ключ или уникальный индекс, используются для определения того, существует ли строка или нет.

6

В Android вы должны использовать SQLiteDatabase.replace(), который вставляет или обновляет. С реализацией Android SQLite вы обычно не используете необработанные запросы, представленные как строки. См http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#replace%28java.lang.String,%20java.lang.String,%20android.content.ContentValues%29

+0

отлично, очень помогает! +1 – Dori

+0

Рад, что это помогло! – Macondo2Seattle

-2

Я обычно использую этот код для этого:

Cursor cur = mDatabase.rawQuery("select * from NICKS where id_nick='"+id_nick+"'); 
cur.moveToFirst(); 
if(cur.getCount()>0){ 
    update... 
}else{ 
    insert... 
} 
Смежные вопросы