2011-11-02 11 views
30

データベースでINSERTまたはEXDIF IF EXISTタイプのプロシージャを実行する必要があります。私は.replace()が行く方法だったことを読む。それは新しいレコードをうまく挿入しますが、レコードがすでに存在する場合、それを更新するようには見えません。このレコードがデータベースにないときに、私はこのコードを実行した場合、私がinsert()をしたかのように、うまくレコードを作成するように見えるAndroidのSQLite - SQLiteDatabase.replace()は実際に何をしていますか?

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

私はこのような何かを持っています。しかし、NAMEを「john」などに変更してreplace()を再度実行すると、レコードが更新されないように見えます。

ドキュメントによると、ここでの構文は次のとおりです。

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

は、なぜそれがinitalValuesと呼ばれていますか?つまり、レコードが存在せず挿入される場合にのみ、これらの値が使用されますか?もしそうなら、メソッドを使ってレコードを更新する方法はありますか?新しい値はどこで指定しますか?

replace()が何であるか誤解している場合、誰かがその目的を説明することができますか?

+1

INSERT OR REPLACEを実行します。 –

+2

'ContentValues'に特別なパラメータを渡すと、' ContentProvider.insert() 'メソッドで' INSERT'と 'REPLACE'プロシージャの両方を使うことができます。私はここにブログ記事を書いています:[SQLite INSERT OR REPLACE through ContentProvider | Buzzing Android](http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/) – JesperB

答えて

29

私が理解しているように、replace()は、SQLite REPLACEキーワードとよく似ています - 挿入に対して一意の制約違反が発生した場合、行が更新されます。したがって、例のID列には、更新する行のデータベーススキーマにPRIMARY KEY制約を設定する必要があります。

+0

私はそれが問題かもしれないと思います。 –

+0

まず、 "_id"フィールドはプライマリキーです。次に、新しいレコードが作成されていません。これは、メソッドが実際に元のレコードを検索していて、新しいレコードを作成していないことを意味します。しかし、私が言ったように、既存のレコードはちょうど更新されていません... –

+2

@ JesperBのブログ記事を引用するのは嬉しいです。 "公式の文書(SQLiteがSQLiteで理解しているように)でわかるように、 REPLACE。つまり、INSERTを行い、競合が原因でINSERTが失敗した場合は、再度INSERTする前に競合する行を削除してください。 –

3

replace()メソッドは実際にsqlコマンドを実行しますinsert or replace into (...) values (...)

関連する問題