【AndroidでSQLiteを制する】SQLiteDatabase#queryを使って色々なセレクトをする
SQLデータベース内のテーブルに対してクエリを実行します。
今回はSQLiteDatabaseに定義されているSQLiteDatabase#queryのいろいろな使い方を説明します。
SQLiteDatabase#queryを使ってGROUP BY句を使用する
SQLiteDatabase#queryを使ってGROUP BY句を設定しデータをグループ化することができます。GROUP BY句は「String groupBy」を設定する必要があります。
下記のSQL文が実行されます。
SELECT * FROM [ table ] GROUP BY [groupBy]
BookDAOにselectWithGroupByメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
public static List<BookDTO> selectWithGroupBy(Context context){
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
Cursor cursor = sqLiteDatabase.query(
LoadToSQLiteMasterContract.Book.TABLE_NAME,
new String[]{
LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE,
"COUNT(" +LoadToSQLiteMasterContract.Book.COLUMN_NAME_SUBTITLE+") AS " + LoadToSQLiteMasterContract.Book.COLUMN_NAME_SUBTITLE,
},
null,
null,
LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE,
null,
null
);
List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
return bookDTOList;
}
SQLiteDatabase#queryを使ってHAVING句を使用する
SQLiteDatabase#queryを使ってHAVING句を設定しグループ化したデータに対して抽出条件を指定することができます。HAVING句は「String having」を設定する必要があります。
下記のSQL文が実行されます。
SELECT * FROM [ table ] GROUP BY [groupBy] HAVING [having]
BookDAOにselectWithHavingメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
public static List<BookDTO> selectWithHaving(Context context){
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
Cursor cursor = sqLiteDatabase.query(
LoadToSQLiteMasterContract.Book.TABLE_NAME,
null,
null,
null,
LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE,
"count("+LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE + ") > 2 ",
null
);
List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
return bookDTOList;
}
SQLiteDatabase#queryを使ってORDER BY句を使用する
SQLiteDatabase#queryを使ってORDER BY句を設定しグループ化したデータに対して抽出条件を指定することができます。ORDER BY句は「String orderBy」を設定する必要があります。
下記のSQL文が実行されます。
SELECT * FROM [ table ] ORDER BY [orderBy]
BookDAOにselectWithOrderByメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
public static List<BookDTO> selectWithOrderBy(Context context){
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
Cursor cursor = sqLiteDatabase.query(
LoadToSQLiteMasterContract.Book.TABLE_NAME,
null,
null,
null,
null,
null,
LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE + " DESC"
);
List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
return bookDTOList;
}
SQLiteDatabase#queryを使ってLIMIT句を使用する
SQLiteDatabase#queryを使ってLIMIT句を設定し出力するデータ数を制限することができます。LIMIT句は「String limit」を設定する必要があります。
下記のSQL文が実行されます。
SELECT * FROM [ table ] LIMIT [limit]
BookDAOにselectWithLimitメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
public static List<BookDTO> selectWithLimit(Context context){
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
Cursor cursor = sqLiteDatabase.query(
LoadToSQLiteMasterContract.Book.TABLE_NAME,
null,
null,
null,
null,
null,
null,
"4"
);
List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
return bookDTOList;
}
SQLiteDatabase#queryを使ってDISTINCT演算子を使用する
SQLiteDatabase#queryを使ってDISTINCT演算子を設定し、重複データを排除することができます。DISTINCT演算子は「boolean distinct」にtrueを設定する必要があります。
下記のSQL文が実行されます。
SELECT DISTINCT [columns….] FROM [ table ]
BookDAOにselectWithDistinctメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
public static List<BookDTO> selectWithDistinct(Context context){
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
Cursor cursor = sqLiteDatabase.query(
true,
LoadToSQLiteMasterContract.Book.TABLE_NAME,
new String[]{LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE},
null,
null,
null,
null,
null,
null
);
List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
return bookDTOList;
}
SQLiteDatabase#queryを使ってDISTINCT演算子を使用する
SQLiteDatabase#queryを使ってDISTINCT演算子を設定し、重複データを排除することができます。DISTINCT演算子は「boolean distinct」にtrueを設定する必要があります。
下記のSQL文が実行されます。
SELECT DISTINCT [columns….] FROM [ table ]
BookDAOにselectWithDistinctメソッドを実装します。
メソッドの中でBookDAO#convertCursorToDTOを使いCursorをBookDTOのリストに変換して返却します。
public static List<BookDTO> selectWithDistinct(Context context){
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
Cursor cursor = sqLiteDatabase.query(
true,
LoadToSQLiteMasterContract.Book.TABLE_NAME,
new String[]{LoadToSQLiteMasterContract.Book.COLUMN_NAME_TITLE},
null,
null,
null,
null,
null,
null
);
List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
return bookDTOList;
}
SQLiteDatabase#queryを使ってキャンセル可能なクエリを実行する
SQLiteDatabase#queryにCancellationSignal インスタンスを渡すことで外部からSQL文の実行に対してキャンセル要求を出すことが可能です。キャンセルが実行されるとSQLiteDatabase#queryはOperationCanceledException を発生させます。
BookDAOにselectWithCancellableメソッドを実装します。
public static List<BookDTO> selectWithCancellable(Context context , CancellationSignal cancellationSignal) throws OperationCanceledException{
SQLiteDatabase sqLiteDatabase = getSqLiteDatabase(context,false);
Cursor cursor = sqLiteDatabase.query(
false,
LoadToSQLiteMasterContract.Book.TABLE_NAME,
null,
null,
null,
null,
null,
null,
null,
cancellationSignal
);
List<BookDTO> bookDTOList = convertCursorToDTO(cursor);
return bookDTOList;
}
また、実行する側のコードは下記のようになります。今回は、cancelが実行された状態のCancellationSignalインスタンスを渡していますが、 本来は任意のタイミングでCancellationSignal#cancelを呼ぶようにしてください。
final CancellationSignal cancellationSignal = new CancellationSignal();
cancellationSignal.setOnCancelListener(new CancellationSignal.OnCancelListener() {
@Override
public void onCancel() {
Toast.makeText(SQLiteActivity.this , "Cancel" ,Toast.LENGTH_SHORT).show();
}
});
cancellationSignal.cancel();
List<BookDTO> bookDTOList = new ArrayList<>();
try {
bookDTOList = BookDAO.selectWithCancellable(getApplicationContext(),cancellationSignal);
} catch (OperationCanceledException e) {
}