ContentResolver および CursorLoader なサンプル

以下コンテンツにお世話になりつつサンプルがでっち上がりましたので共有させて頂きます。

基本的にそのまんま使ってるカンジではあります。
github なナニは以下。

TODO

ええと、以下を試してみる方向ス。

  • もう一つのテーブルを云々する Activity をでっち上げる
  • カラムを増やして Group By な動作確認

したいこと

  • 作成日付なカラム追加
    • insert した日付をナニ
  • 日付で group by してクエリ実行
  • 日付でクエリ実行して一覧表示

うーん、なんか色々あるな。つうか sqlite は日付を扱うことがあまり得意ではない的ドキュメントがあって、むむむむと言っております。
とりあえず

  • TEXT 型にする
  • フォーマットは yyyy-mm-dd なカンジ
  • デフォルトで今日の日付をセット

できた

結局 SQLiteDatabase#rawQuery メソドを使って云々、でした。

   @Override
   public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
       checkUri(uri);
       final int code = sUriMatcher.match(uri);
       SQLiteDatabase db = mOpenHelper.getReadableDatabase();

       for (final Contract contract : Contract.values()) {
           if (code == contract.byDateAllCode) {
               String sql = "select date from table2 group by date";
               return db.rawQuery(sql, null);
           } else if (code == contract.byDateCode) {
               String sql = "select _id, date, title2, note2 from table2 where date = \"" + 
            		   uri.getPathSegments().get(2) + 
            		   "\"";
               Log.d("SQLiteProvider", "sql string is " + sql);
               return db.rawQuery(sql, null);
           }
       }

       Cursor cursor = db.query(uri.getPathSegments().get(0), projection, appendSelection(uri, selection),
               appendSelectionArgs(uri, selectionArgs), null, null, sortOrder);
       cursor.setNotificationUri(getContext().getContentResolver(), uri);
       return cursor;
   }

あと、UriMatcher なナニを以下なカンジで追加してます。

       sUriMatcher.addURI(AUTHORITY, Contract.Table2.tableName + "/date", Contract.Table2.byDateAllCode);
       sUriMatcher.addURI(AUTHORITY, Contract.Table2.tableName + "/date/*", Contract.Table2.byDateCode);

最初、# でハマッてたんですが Uri てきに以下なカンジなので

		mUri = Uri.parse("content://com.example.test.cp/table2/date/2013-3-14");

文字列ってことで * にしてみたら OK でした。良かった。本当に良かった。
つうことで別件対応に着手、なあたりがアレorz