【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) { }