【AndroidでSQLiteを制する】SQLiteDatabase#queryを使ってテーブルをセレクトする
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文字
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以外」の文字
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; }