【AndroidでSQLiteを制する】SQLiteDatabase#updateを使用してデータをアップデートする
SQLデータベース内のテーブルのデータを更新します。
今回はSQLiteDatabaseに定義されているアップデートを行うコンビニエンスメソッドを使用します。
SQLiteDatabase#updateを使用する
SQLiteDatabase#updateはテーブルのデータを更新するコンビニエンスメソッドです。SQLiteDatabase#updateには4つの引数があります。
| String table | データベース内のテーブル名を指定します。 |
| ContentValues values |
ContentValues
を使用してアップデートするデータを設定して渡します。 ContentValues#putの第1引数にテーブルのカラム名を、第2引数にはデータを設定します。 |
| String whereClause |
WHERE句を指定します。 「[カラム名] = ? AND [カラム名] = ? 」のようにクエリに条件を設定します。 ?はwhereArgsで指定します。 WHERE句が不要な場合はnullを指定してください。 |
| String[] whereArgs |
String whereClauseで指定した「?」を埋めるための文字列を配列で指定できます。 「?」の数よりも配列の要素数が多い場合は例外が発生します。 WHERE句に「?」が存在しない場合はnullを指定してください。 |
今回は指定したidのデータをBookDTOの内容を使用して更新します。
BookDAO
public static long update(Context context , BookDTO bookDTO , String id){
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,true);
long rowId = sqLiteDatabase.update(
LoadToSQLiteMasterContract.Book.TABLE_NAME,
convertContentValues(bookDTO),
LoadToSQLiteMasterContract.Book._ID + " = ? ",
new String[]{id}
);
return rowId;
}
SQLiteActivityにBookDAO#updateメソッドを使用し、SQLiteActivity#updateBookを実装します。
private void updateBook(BookDTO book) {
long rowId = BookDAO.update(getApplicationContext() , book , "1");
Toast.makeText(this, "rowId:" + rowId , Toast.LENGTH_SHORT).show();
}
SQLiteDatabase#updateWithOnConflictを実際に使用する
SQLiteDatabase#updateWithOnConflictはテーブルのデータを更新するコンビニエンスメソッドです。SQLiteDatabase#updateとの違いは5つ目の引数に競合解消アルゴリズムを指定できることです。
SQLiteDatabase#updateWithOnConflictには5つの引数があります。
| String table | データベース内のテーブル名を指定します。 | ||||||||||||
| ContentValues values |
ContentValues
を使用してアップデートするデータを設定して渡します。 ContentValues#putの第1引数にテーブルのカラム名を、第2引数にはデータを設定します。 |
||||||||||||
| String whereClause |
WHERE句を指定します。 「[カラム名] = ? AND [カラム名] = ? 」のようにクエリに条件を設定します。 ?はwhereArgsで指定します。 WHERE句が不要な場合はnullを指定してください。 |
||||||||||||
| String[] whereArgs |
String whereClauseで指定した「?」を埋めるための文字列を配列で指定できます。 「?」の数よりも配列の要素数が多い場合は例外が発生します。 WHERE句に「?」が存在しない場合はnullを指定してください。 |
||||||||||||
| int conflictAlgorithm |
SQLiteには制約違反が発生した場合の解消アルゴリズムが複数実装されています。
この引数にはSQLiteDatabaseに定義されています。
|
今回は競合解消アルゴリズムにCONFLICT_REPLACEを設定することで競合が発生した場合は既存のデータを削除します。
BookDAO
public static long updateWithOnConflict(Context context , BookDTO bookDTO){
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,true);
long rowId = sqLiteDatabase.updateWithOnConflict(
LoadToSQLiteMasterContract.Book.TABLE_NAME,
convertContentValues(bookDTO),
"",
null,
SQLiteDatabase.CONFLICT_REPLACE
);
return rowId;
}
SQLiteActivityにBookDAO#updateWithOnConflictメソッドを使用し、SQLiteActivity#updateWithOnConflictBookを実装します。
private void updateWithOnConflictBook(BookDTO book) {
long rowId = BookDAO.updateWithOnConflict(getApplicationContext() , book);
Toast.makeText(this, "rowId:" + rowId , Toast.LENGTH_SHORT).show();
}