web-dev-qa-db-ja.com

Android SQLiteの挿入または更新

ドキュメントに見られるように、挿入または更新を行うための構文は次のとおりです: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で挿入または更新を行うためのベストプラクティスは何ですか?

58
Luis Neves

これはメソッドです SQLiteDatabase.insertWithOnConflict() 。 sqliteで このドキュメント が何を参照しているかを理解する

42
kdehairy

SQLiteDatabase.replace() はこれを行い、基本的に以下を呼び出します:

insertWithOnConflict(table, nullColumnHack, initialValues, CONFLICT_REPLACE);

残念なことに、ドキュメントはあまり明確ではありません。

9
aleb

その操作名は「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)});
}
5
z1lV3r

SQLiteDatabase.replace() はおそらく探しているものです。私は試していませんが、ドキュメントには、新しく挿入された行の行IDが返されると書かれているため、動作する可能性があります。

3

私は同じ問題を抱えていましたが、オブジェクトにすでに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がない場合は挿入します。

お役に立てれば。

2
pouya

replaceOrThrow(String table、String nullColumnHack、ContentValues initialValues)

Docs say ...データベース内の行を置き換える便利な方法。行がまだ存在しない場合、新しい行を挿入します。

基本的にはinsertWithOnConflictを呼び出します

0
Alezis