【AndroidでSQLiteを制する】SQLiteDatabase#queryを使ってテーブルをセレクトする

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

SQLデータベース内のテーブルに対してクエリを実行します。
今回はSQLiteDatabaseに定義されているSQLiteDatabase#queryのいろいろな使い方を説明します。

SQLiteDatabase#queryを使って全データ・全カラムを取得する

SQLiteDatabase#queryを使って全データ・全カラムを取得することができます。
テーブル名(String table)を指定しそれ以外の引数をnullにすることで下記のSQL文が実行されます。
SELECT * FROM [ table ]
BookDAOにselectAllメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
  public static List<BookDTO> selectAll(Context context){
      SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
      Cursor cursor = sqLiteDatabase.query(
              LoadToSQLiteMasterContract.Book.TABLE_NAME,
              null,
              null,
              null,
              null,
              null,
              null
      );
      List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
      return bookDTOList;
  }

SQLiteDatabase#queryを使ってテーブル内のカラムを指定して取得する

SQLiteDatabase#queryの第2引数で取得するカラムを指定することができます。
カラム名配列(String[] columns)を指定することで下記のSQL文が実行されます。
SELECT columns[0],columns[1],… FROM [ table ]
また、カラム名としてAS句を指定することができます。
BookDAOにselectSpecifyColumnsメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
  public static List<BookDTO> selectSpecifyColumns(Context context){
      SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
      Cursor cursor = sqLiteDatabase.query(
              LoadToSQLiteMasterContract.Book.TABLE_NAME,
              new String[]{
                  LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE,
                  "'AS句で作成したデータ' AS " + LoadToSQLiteMasterContract.Book.COLUMN_NAME_SUBTITLE,
              },
              null,
              null,
              null,
              null,
              null
      );
      List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
      return bookDTOList;
  }

SQLiteDatabase#queryを使って条件を指定してデータ取得する

SQLiteDatabase#queryの第3引数と第4引数で取得するデータの条件を指定することができます。
String selectionでWhere句を指定することができます。この文字列の中に「?」を含むことできます。
String[] selectionArgsはString selectionの中に含まれる「?」を置換します。
SQLは下記のようになり、selectionの中にある「?」は「'[selectionArgsの文字列]’」に置換されています。
SELECT * FROM [ table ] WHERE [ selection ]
また、カラム名としてAS句を指定することができます。
BookDAOにselectWithWhereメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
  public static List<BookDTO> selectWithWhere(Context context){
      SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
      Cursor cursor = sqLiteDatabase.query(
              LoadToSQLiteMasterContract.Book.TABLE_NAME,
              null,
              LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE +" = ?",
              new String[]{"タイトル1"},
              null,
              null,
              null
      );
      List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
      return bookDTOList;
  }

SQLiteDatabase#queryでLIKE演算子を使用してデータ取得する

SQLiteDatabase#queryの第3引数と第4引数で取得するデータの条件にLIKE演算子を使用することができます。
LIKE演算子を使用するにはString selectionに「LIKE」を含めます。
String[] selectionArgsはString selectionの中に含まれる「?」を置換します。
SQLiteではLIKE演算子では下記の2つのワイルドカードが使用できます。
  • 「 % 」は任意の0文字以上の文字列
  • 「 _ 」は任意の1文字
SQLは下記のようになり、selectionの中にある「?」は「'[selectionArgsの文字列]’」に置換されています。
SELECT * FROM [ table ] WHERE [ selection ]
そのため、ワイルドカードは必ずString[] selectionArgsに含めるようにしてください。
String selectionに含めた場合はSQLiteExceptionが発生します。
BookDAOにselectWithWhereLikeメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
  public static List<BookDTO> selectWithWhereLike(Context context){
      SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
      Cursor cursor = sqLiteDatabase.query(
              LoadToSQLiteMasterContract.Book.TABLE_NAME,
              null,
              LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE +" LIKE ?",
              new String[]{"タ%1"},
              null,
              null,
              null
      );
      List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
      return bookDTOList;
  }

SQLiteDatabase#queryでGLOB演算子を使用してデータ取得する

SQLiteDatabase#queryの第3引数と第4引数で取得するデータの条件にGLOB演算子を使用することができます。
GLOB演算子を使用するにはString selectionに「GLOB」を含めます。
String[] selectionArgsはString selectionの中に含まれる「?」を置換します。
SQLiteではGLOB演算子では下記のワイルドカードが使用できます。
  • 「 * 」は任意の0文字以上の文字列
  • 「 ? 」は任意の1文字
  • 「 [abc] 」は「a」or「b」or「c」のいずれかに一致
  • 「 [a-d] 」は「aからd」までにいずれかに一致
  • 「 [^a] 」は「a以外」の文字
SQLは下記のようになり、selectionの中にある「?」は「'[selectionArgsの文字列]’」に置換されています。
SELECT * FROM [ table ] WHERE [ selection ]
そのため、ワイルドカードは必ずString[] selectionArgsに含めるようにしてください。
String selectionに含めた場合はSQLiteExceptionが発生します。
BookDAOにselectWithWhereGlobメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
  public static List<BookDTO> selectWithWhereGlob(Context context){
      SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
      Cursor cursor = sqLiteDatabase.query(
              LoadToSQLiteMasterContract.Book.TABLE_NAME,
              null,
              LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE +" GLOB ? ",
              new String[]{"タイトル[^1]"},
              null,
              null,
              null
      );
      List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
      return bookDTOList;
  }

SQLiteDatabase#queryでIN演算子を使用してデータ取得する

SQLiteDatabase#queryの第3引数と第4引数で取得するデータの条件にIN演算子を使用することができます。
IN演算子を使用するにはString selectionに「IN」を含めます。
String[] selectionArgsはString selectionの中に含まれる「?」を置換します。
SQLは下記のようになり、selectionの中にある「?」は「'[selectionArgsの文字列]’」に置換されています。
SELECT * FROM [ table ] WHERE [ selection ]
BookDAOにselectWithWhereInメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
  public static List<BookDTO> selectWithWhereIn(Context context){
      SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
      Cursor cursor = sqLiteDatabase.query(
              LoadToSQLiteMasterContract.Book.TABLE_NAME,
              null,
              LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE +" IN (?,?) ",
              new String[]{"タイトル1" ,"タイトル2"},
              null,
              null,
              null
      );
      List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
      return bookDTOList;
  }