SQLiteDatabaseクラスを使いSQLを実行する(update) 【Android TIPS】

この記事は2013年4月1日に書かれたものです。内容が古い可能性がありますのでご注意ください。


update()メソッド

SQLiteDatabaseオブジェクトを使い、行を更新するにはupdate()を使用します。
update()を使用するには、あらかじめContentValuesオブジェクトに更新するデータをセットしておく必要があります。insert()を使用する時と同じイメージです。

update()のシグネチャは以下の通り。

public int update (String table, ContentValues values, String whereClause, String[] whereArgs)

 

第1引数はテーブル名です。

第2引数はContentValueオブジェクトです。

第3引数のwhereClauseには、更新するデータのWHERE条件を指定します。
この値をnullに指定すると、すべての行が更新対象となります。

第4引数のwhereArgsには、更新するデータのwhere条件を「?」を使ってパラメータで指定した場合のパラメータ値をString配列で指定します。
WHERE条件に「?」パラメータが無い場合は、nullを指定します。

 

戻り値には更新した行数が返されます。

 

使用例は以下の通り。dbはSQLiteDatabaseオブジェクトです。

ContentValues values = new ContentValues();
values.put("age", 100);
db.update("person", values, "name = ?", new String[]{"佐藤 一郎"});

 

この例で実行しているupdate()は以下のSQLと同義になります。

UPDATE person SET age = 100 WHERE name = '佐藤 一郎';

 

ContentValuesクラスはnewでインスタンス化し、put()を使いカラム名と対応する値を登録していきます。

また、WHERE句は、第3引数の「name = ?」のパラメータとなっている「?」のところに、第4引数の「佐藤 一郎」が埋め込まれた形となります。

 

この例では「?」パラメータは1つしか使用していませんが、2つ以上を指定することも可能です。

db.update("person", values, "age > ? AND age < ?", new String[]{"20", "50"});

 

updateWithOnConflict()メソッド

update()を使用する以外にもupdateWithOnConflict()というメソッドを使用することもできます。

このメソッドはupdate()の中から呼び出されるメソッドで、実際にSQL文の生成や実行を行っています。

 

シグネチャは以下の通り。

public int updateWithOnConflict(String table, ContentValues values,
        String whereClause, String[] whereArgs, int conflictAlgorithm)

 

update()と違っている点は第5引数のconflictAlgorithmが追加されているということです。

この引数はUPDATE文を実行時にコンフリクト(衝突)が発生した際、どのように処理するかを指定するオプションです。

 

オプションの詳細については、insertWithOnConflict()メソッドのときと同じですので、ここでは割愛します。

■SQLiteDatabaseクラスを使いSQLを実行する(insert)【Android TIPS】

http://tech.pjin.jp/archives/23251

 

最後に、Androidソースコードの抜粋を紹介します。

public static final int CONFLICT_ROLLBACK = 1;
public static final int CONFLICT_ABORT = 2;
public static final int CONFLICT_FAIL = 3;
public static final int CONFLICT_IGNORE = 4;
public static final int CONFLICT_REPLACE = 5;
public static final int CONFLICT_NONE = 0;

private static final String[] CONFLICT_VALUES = new String[]
        {"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "};

public int update(String table, ContentValues values, String whereClause, String[] whereArgs) {
    return updateWithOnConflict(table, values, whereClause, whereArgs, CONFLICT_NONE);
}

public int updateWithOnConflict(String table, ContentValues values,
        String whereClause, String[] whereArgs, int conflictAlgorithm) {
    if (values == null || values.size() == 0) {
        throw new IllegalArgumentException("Empty values");
    }

    acquireReference();
    try {
        StringBuilder sql = new StringBuilder(120);
        sql.append("UPDATE ");
        sql.append(CONFLICT_VALUES[conflictAlgorithm]);
        sql.append(table);
        sql.append(" SET ");

        // ... 省略 ...

        if (!TextUtils.isEmpty(whereClause)) {
            sql.append(" WHERE ");
            sql.append(whereClause);
        }

        SQLiteStatement statement = new SQLiteStatement(this, sql.toString(), bindArgs);
        try {
            return statement.executeUpdateDelete();
        } finally {
            statement.close();
        }
    } finally {
        releaseReference();
    }
}

SQL文を生成していることや、コンフリクトオプションを設定していること、SQL文を実行していることがわかります。

また、update()ではコンフリクトオプションを設定せずに実行していることもわかりますね。

  • このエントリーをはてなブックマークに追加

PAGE TOP