【AndroidでSQLiteを制する】SQLiteDatabase#replaceを使用してデータをリプレースする

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

SQLデータベース内のテーブルにデータを挿入または更新します。
今回はSQLiteDatabaseに定義されているリプレースを行うコンビニエンスメソッドを使用します。

SQLiteDatabase#replaceを使用する

SQLiteDatabase#replaceをデータベース内のテーブルにデータを挿入または更新するコンビニエンスメソッドです。
リプレースするデータの主キーが存在しない場合は挿入し、主キーが存在する場合はその行に対して更新を行います。
String table データベース内のテーブル名を指定します。
String nullColumnHack SQLでは完全に空の行を挿入することは許されていません。 この引数は第3引数に空のContentValuesを指定された場合に意味を持ちます。 このメソッドはContentValuesが空の場合はインサート文を作成することができないため、この引数に適当なカラム名を指定します。 下記のようなSQLが生成されます。
INSERT OR REPLACE INTO [table名] ([nullColumnHack]) VALUES (NULL);
ContentValues initialValues ContentValuesを使用してリプレースするデータを設定して渡します。
ContentValues#putの第1引数にテーブルのカラム名を、第2引数にはデータを設定します。
このメソッドはSQLエラーが発生しても例外が発生することがないことに注意してください。 SQLエラーが発生した時にこのメソッドは-1を返却します。
BookDAOにreplaceを実装する
また、BookDTOをContentValuesに変換するメソッドを実装します。
  public static long replace(Context context , BookDTO bookDTO){
      SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,true);
      long rowId = sqLiteDatabase.replace(
              LoadToSQLiteMasterContract.Book.TABLE_NAME,
              COLUMN_NAME_SUBTITLE,
              convertContentValues(bookDTO)
      );
      return rowId;
  }

SQLiteActivityにBookDAO.replaceを使用するreplaceBookを実装する。
  private void replaceBook(BookDTO book) {
      long rowId = BookDAO.replace(getApplicationContext() , book);
      Toast.makeText(this, "rowId:" + rowId , Toast.LENGTH_SHORT).show();
  }

SQLiteDatabase#replaceOrThrowBookを使用する

SQLiteDatabase#replaceOrThrowBookはデータベース内のテーブルにデータを挿入または更新するコンビニエンスメソッドです。
リプレースするデータの主キーが存在しない場合は挿入し、主キーが存在する場合はその行に対して更新を行います。
String table データベース内のテーブル名を指定します。
String nullColumnHack SQLでは完全に空の行を挿入することは許されていません。 この引数は第3引数に空のContentValuesを指定された場合に意味を持ちます。 このメソッドはContentValuesが空の場合はインサート文を作成することができないため、この引数に適当なカラム名を指定します。 下記のようなSQLが生成されます。
INSERT OR REPLACE INTO [table名] ([nullColumnHack]) VALUES (NULL);
ContentValues initialValues ContentValuesを使用してリプレースするデータを設定して渡します。
ContentValues#putの第1引数にテーブルのカラム名を、第2引数にはデータを設定します。
このメソッドはSQLエラーが発生した場合は例外が発生します。
BookDAOにreplaceOrThrowを実装する
    public static long replaceOrThrow(Context context , BookDTO bookDTO){
        SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,true);
        long rowId = sqLiteDatabase.replaceOrThrow(
                LoadToSQLiteMasterContract.Book.TABLE_NAME ,
                COLUMN_NAME_SUBTITLE,
                convertContentValues(bookDTO)
        );
        Toast.makeText(context, "rowId:" + rowId , Toast.LENGTH_SHORT).show();
        return rowId;
    }

SQLiteActivityにBookDAO.replaceOrThrowを使用するreplaceOrThrowBookを実装する。
  private void replaceOrThrowBook(BookDTO book) {
      long rowId = BookDAO.replaceOrThrow(getApplicationContext() , book);
      Toast.makeText(this, "rowId:" + rowId , Toast.LENGTH_SHORT).show();
  }