【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のリストに変換して返却します。
  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) {

  }