2011-07-07 7 views
14

重複する行を挿入すると、AndroidのSQLiteライブラリは競合をどのように解決しますか?私は残念ながらあなたが行がREPLACE Dできるようになりますテーブル定義でUNIQUEインデックスを指定することができ、APIレベル8でAndroidのSQLiteDatabaseの競合解消

答えて

30

を開始含まれていたSQLiteDatabase.insertOnConflict()方法を持たない、APIレベル7のために私のアプリを構築しています:

CREATE TABLE mytable (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT NOT NULL, 
    UNIQUE (id) ON CONFLICT REPLACE 
) 

行INSERTまたはUPDATEステートメントがすでに存在しているIDと行を追加しようとすると、既存の行を新しいものと交換されます。

+1

+1危険性があり危険ですが、有用な機能私はbeforについて聞いていません。 – piotrpo

+3

実際、すべての場合において、それが慎重に行われ、望ましい結果になるようにする必要があります。ローカルデータベースをリモートデータと同期させるなどの作業に最適です。 –

+0

ありがとうございます。これは今のところうまくいくでしょう。しかし、私が理解しているように、この宣言でテーブルを作成すると、競合が発生するたびに置き換えが行われます。しかし、私が挿入を行うたびに、この種の紛争解決を使用したくないのであればどうしますか? – kibibyte

0

デフォルトでは、重複インデックス挿入時に一意インデックス例外がスローされます。あなたがINSERT INTO ... ON CONFLICT...を言うことができるSQLiteの中ON CONFLICT句があります

select * from people where name = 'Smith'; 
//if resultset is empty then perform insert 
insert into people values 'Smith' 
6

:擬似コード - 一般的な解決策は、前の挿入を実行し、チェックレコードの存在です。

ドキュメントをお読みください。 http://www.sqlite.org/lang_conflict.html

+0

実際には、あなたが常にそうしたくない場合は、これを使用してください。紛争に置き換えてください。 –

+0

これは複数の挿入ステートメントで機能しますか? – kaz