insert()
オーバーライドされたコンテンツプロバイダのメソッドでSQLiteDatabase
更新メソッドを呼び出すことはできますか?Android Contentprovider - 挿入メソッド内の更新
11
A
答えて
26
は、基本的には大丈夫ですが、あなたは、コードを提供しなかったので、私はちょうどそれ
まずのために2つの可能な方法を投稿することができます:第二
// In your content provider
public Uri insert(...) {
long insertId = db.insert(...);
if(insertId == -1) {
// insert failed, do update
db.update(...);
}
}
:
public Uri insert(...) {
long insertId = db.insertWithOnConflict(table, null, values, SQLiteDatabase.CONFLICT_REPLACE)
if(insertId == -1) {
// insert and update/replace failed
}
}
チェックアウトを参照してください。ほとんどの場合、行が存在する場合に特定のフィールドのみを更新し、そうでない場合はすべてのフィールドを持つことを望まない場合は、最後のメソッドで十分です。
insertWithOnConflictの最も有用な必要性は、行を挿入することができ、既に存在する場合は挿入を無視して、代わりに既存の行のUri /主キーを返すことです。
5
オーバーライドされたメソッドでは、どのような記述をするかは自由です。 はい、いいです。
あなたは何をしようとしているのかわかりませんが、SQLiteDatabase
のreplace()
メソッドも見てみたいです。多分あなたのニーズに合っているでしょう。
私の問題は、列Aに特定の値を持つ行が存在するかどうかを確認する必要があることです(Aは一意のキーではありません)。 はいの場合は、この行を更新する必要があります。 – Mak
もし新しい行を作成する必要があれば....それを行う最善の方法は何ですか – Mak
2つの方法があります:1.置き換えます(行が存在しない場合はそれが挿入され、それを削除して新しいものを挿入します)。 2.行を挿入しよう...成功しなかった場合(行がすでに存在することを意味する)、更新します。だから、ある行の値のような古い行から何かが必要な場合は、insert + updateを使用してください。そうでない場合は、replaceを使用します(古い行のすべてのデータが失われます)。 – Edi