ドキュメントに見られるように、挿入または更新を行うための構文は次のとおりです:INSERT OR REPLACE INTO <table> (<columns>) VALUES (<values>)
public long insert (String table, String nullColumnHack, ContentValues values)
public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
または、準備済みのSQLステートメントとrawQueryを使用して行う必要がありますか?
Androidで挿入または更新を行うためのベストプラクティスは何ですか?
これはメソッドです SQLiteDatabase.insertWithOnConflict() 。 sqliteで このドキュメント が何を参照しているかを理解する
SQLiteDatabase.replace() はこれを行い、基本的に以下を呼び出します:
insertWithOnConflict(table, nullColumnHack, initialValues, CONFLICT_REPLACE);
残念なことに、ドキュメントはあまり明確ではありません。
その操作名は「upsert」であり、私がそれを解決する方法は、行を一意にするテーブルの列を識別することです。
例:_id、name、job、hours_worked
使用する列は、名前と仕事です。
private int getID(String name, String job){
Cursor c = dbr.query(TABLE_NAME,new String[]{"_id"} "name =? AND job=?",new String[]{name,job},null,null,null,null);
if (c.moveToFirst()) //if the row exist then return the id
return c.getInt(c.getColumnIndex("_id"));
return -1;
}
データベースマネージャークラスで:
public void upsert(String name, String job){
ContentValues values = new ContentValues();
values.put("NAME",name);
values.put("JOB",job);
int id = getID(name,job);
if(id==-1)
db.insert(TABLE_NAME, null, values);
else
db.update(TABLE_NAME, values, "_id=?", new String[]{Integer.toString(id)});
}
SQLiteDatabase.replace() はおそらく探しているものです。私は試していませんが、ドキュメントには、新しく挿入された行の行IDが返されると書かれているため、動作する可能性があります。
私は同じ問題を抱えていましたが、オブジェクトにすでにIDがある場合は更新する必要があり、IDがない場合は挿入する必要があることに気づいたので、これは私が問題を解決するためにステップバイステップでした:
1-オブジェクトのgetIdでIntegerを使用するか、IDを初期化してどのように表示されるか:ここに私のコードがあります
public Integer getId() {
return id;
}
2- ContentValuesにすべてを配置した後、挿入または更新のためにメソッドのIDを確認します:
if(myObject.getId()!= null ){
int count = db.update(TABLE_NAME,myContentValues,ID + " = ? ",
new String[]{String.valueOf(myObject.getId())});
if(count<=0){
//inserting content values to db
db.insert(TABLE_NAME, null, myContentValues);
}
} else {
db.insert(TABLE_NAME, null, myContentValues);
}
ここで何が起こるかは、存在する場合はIDをチェックし、その行を更新しますが、更新メソッドが-1を返す場合、そのIDを持つ行がなかったことを意味するため、行を挿入し、IDがない場合は挿入します。
お役に立てれば。
replaceOrThrow(String table、String nullColumnHack、ContentValues initialValues)
Docs say ...データベース内の行を置き換える便利な方法。行がまだ存在しない場合、新しい行を挿入します。
基本的にはinsertWithOnConflictを呼び出します