【AndroidでSQLiteを制する】SQLiteDatabase#queryを使って色々なセレクトをする

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

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のリストに変換して返却します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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のリストに変換して返却します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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のリストに変換して返却します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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のリストに変換して返却します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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のリストに変換して返却します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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のリストに変換して返却します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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メソッドを実装します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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を呼ぶようにしてください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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) {
 
}