Notepad 再読

ContentProvider あたりのソレを再確認。
とりあえず、NotePadProvider.java の不明点掘削メモを以下に。

SQLiteQueryBuilder クラス

例えば query メソドで以下な記述があります。

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        qb.setTables(NOTES_TABLE_NAME);

        switch (sUriMatcher.match(uri)) {
        case NOTES:
            qb.setProjectionMap(sNotesProjectionMap);
            break;

SQLQueryBuilder というクラスは SELECT による SQL 問合せのためのクラスとのこと。setProjectionMap というメソドはカラム名の別名を云々な模様。SELECT 分で AS を使って別名を、にあたる模様。
NotePad な実装では基本同じになってます。

        sNotesProjectionMap = new HashMap<String, String>();
        sNotesProjectionMap.put(NoteColumns._ID, NoteColumns._ID);
        sNotesProjectionMap.put(NoteColumns.TITLE, NoteColumns.TITLE);
        sNotesProjectionMap.put(NoteColumns.NOTE, NoteColumns.NOTE);
        sNotesProjectionMap.put(NoteColumns.CREATED_DATE, NoteColumns.CREATED_DATE);
        sNotesProjectionMap.put(NoteColumns.MODIFIED_DATE, NoteColumns.MODIFIED_DATE);

以下がクエリ実行な部分かな。

        // Get the database and run the query
        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

projection、selection、selectionArgs は query の引数ですね。query の手続き定義としては

  • SQLiteQueryBuilder なオブジェクト生成
  • setTables メソドでテーブル名設定
  • UriMatcher#match メソドに引数で渡された Uri オブジェクトを渡す
    • 戻りは static なブロックで初期化する時に渡した ID が戻る
    • UriMatcher#match の戻りが一覧であれば SQLiteQueryBuilder#setProjectionMap メソド呼び出し
    • 戻りが ID 付きの場合は上に加えて appendWhere メソドで検索キーの指定
      • Uri#getPathSegments は Uri のパス部分の取り出しか
      • notes/:id の :id が 1 にあたる模様
  • 並び順を設定
  • クエリ実行
  • Cursor#setNotificationUri 呼び出し
  • Cursor なオブジェクトを戻す

という流れか。

getType メソド

これも定型か。定義は以下。

    @Override
    public String getType(Uri uri) {
        switch (sUriMatcher.match(uri)) {
        case NOTES:
        case LIVE_FOLDER_NOTES:
            return NoteColumns.CONTENT_TYPE;

        case NOTE_ID:
            return NoteColumns.CONTENT_ITEM_TYPE;

        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }

戻す文字列は BaseColumns を継承して作るクラスで定義されてて以下。

        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.note";
        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.note";

データタイプを表現する文字列については確認必要。
とりあえずエントリ投入します。insert、update、delete についてはこの後掘削対応すれば追記の方向にて。