プロジェクト

全般

プロフィール

Androidプログラミング-コンテントプロバイダ

コンテントプロバイダ概要

データを保持し、同一プログラム内あるいは別なプログラムに対してデータの読み書きを一定の枠組みで行わせる機能を持つコンポーネントです。
アプリ間でデータの受け渡しをする場合、ウィジェットにデータを渡す場合、検索の枠組みを利用する場合などに利用します。
データの読み書きのインタフェースはSQLをかなり意識したものとなっており、データの読み出しはCursorを使い、データの書き込みはContentValuesを使います。

利用イメージ

データを検索して取得

コンテントURIと検索条件を指定し、検索結果をCursorで受け取ります。

Cursor cursor = null;
try {
    cursor = getContentResolver().query(
        "content://com.torutk.mymemo.provider/memos",    // コンテントURI
        null,                                           // 取得するスキーマのキー名配列(String[])
        null,                                           // 検索条件文字列(SQLのwhere句相当)
        null,                                           // 検索条件に含まれるパラメータ('?')の置換文字配列
        null                                            // ソート指定(SQLのORDER BY句相当)
    );
    while (cursor.moveToNext()) {
        String title = cursor.getString(getColumnIndex("title"));
        String message = cursor.getString(getColumnIndex("message"));
        :
    }
} finally {
    if (cursor != null) cursor.close();
}
  • 注1)利用イメージを示すため、文字列は即値を記述していますが、実際にはコントラクトクラスを用意し、そこに文字列定数を定義して利用します。

実装の流れ

クラス実装の概要

contentprovider.png

  • MemoColumnsは定数定義のクラスのため、インスタンス化できないようAbstractとしている
    → interfaceとしてもよいかも

決めておくこと

  1. コンテントURI
  2. データの構造(キー・バリュー)
  3. コントラクト・クラス名
  4. コンテントプロバイダ・クラス名
  5. 永続化方法

コンテントURI

コンテントURIは、利用者がデータの読み書きで指定する識別子です。コンテントURIは、URIの仕様に則り、スキーマ+オーソリティ+パスから構成します。

content://com.torutk.mymemo.provider/memos
   +            +                    +-- パス
   |            +-- オーソリティ
   +-- スキーマ
  • スキーマは、content://固定
  • オーソリティは、コンテントプロバイダを提供するアプリケーションのパッケージ名+provider、またはそれに準拠する名前
  • パスは、データを表す名前。永続化にSQLを使う場合はテーブル名とすることが多い。

データの構造

コンテントプロバイダを介してデータを読み書きする場合、データはCursorおよびContentValuesに詰めて受け渡します。
Cursorは、行を動かして、現在指し示している行の中から列名を元に列インデックスから値を取り出します。
ContentValuesは、列名をキーとして値を取り出し、または格納します。

なお、データを一意に識別するIDは、必ず_idとします。
例を示します。

列名
_id int
title String
message String

コントラクト・クラス名

コントラクト・クラスは、コンテントプロバイダと利用者との間でデータ読み書きに使う定数を定義します。
命名は、コンテントURIのパス部に付けたデータ名か、データ名にColumnsを付けた名前とすることが一般的です。

例:Memos

コンテントプロバイダ・クラス名

コンテントプロバイダのクラス名は、データ名+Providerとするか、データの概念名+Providerとします。

例:MemosProvider

永続化方法

端末ローカルにデータを永続化する場合、主に次の3種類が考えられます。

  1. SharedPreference
  2. 生のファイル
  3. データベース(SQLite、Realm等)

実装例

source:learn/android/TempRecorderClassic/app/src/main/java/com/torutk/temprecorder/TempProvider.java