My Photo

« 2点では物足りない、五輪予選マレーシア戦 | Main | 第27節、新潟終わった »

September 22, 2011

Androidアプリ開発メモ022:コンテンツプロバイダ

コンテンツプロバイダ

コンテンツプロバイダはアプリが管理しているリソースを他のアプリに提供する仕組みというかコンポーネントというか。 コンテンツプロバイダの初期化はonCreate()で行う。

public abstract boolean onCreate()
コンテンツプロバイダ生成時に呼ばれる。
戻り値:成功かどうか

アプリ内のリソースを提供するコンテンツプロバイダの場合、リソースをファイルに変換して、そのファイルでParcelFileDescriptorを作成して返す。
オーバーライドするメソッドは以下。

public ParcelFileDescriptor openFile(Uri uri,String mode)
ファイル要求時に呼ばれる。

public abstract Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
データベースのクエリー命令時に呼ばれる。
引数はAndroidアプリ開発メモ011:SQLiteの利用を参照
戻り値:カーソル

public abstract Uri insert(Uri uri, ContentValues values)
データベースの挿入命令時に呼ばれる。

public abstract int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
データベースの更新命令時に呼ばれる。

public abstract int delete(Uri uri, String selection, String[] selectionArgs)
データベースの削除命令時に呼ばれる。

public abstract String getType(Uri uri)
MIMEタイプを取得する。

openFile()、getType()、はっきりいってよくわからんです。。。

AndroidManifest.xmlにprovider要素を追加する。
authorities属性の値はクラスの完全修飾名を小文字にしたものとするのが一般的。

<provider
    android:name=".FileProvider"
    android:authorities="com.example.fileprovider.fileprovider">
</provider>

コンテンツプロバイダの利用

コンテンツプロバイダを利用するにはContext内の android.content.ContentResoloverを利用して、URIを指定してInputStreamを取得しそこからデータを読み込む。
URIは以下の構成である。

content://com.example.transporationsprovider/trains/122
{----A---}{-----------------B--------------}{--C--}{-D-}

  1. "content://"の部分はコンテツプロバイダにより制御されるデータであることを示す標準プレフィックス。変更できない。
  2. コンテンツプロバイダを識別する部分。AndroidManifest.xmlのprovider要素のandroid:authorities属性で指定した名前。
  3. データタイプの指定。省略化。サブタイプがある場合は "land/bus" や "land/trans" のように指定できる。
  4. 特定のレコードを指定する場合のID。省略化。IDを指定しない場合、以下のようにURIの最後のスラッシュを省略する。
    content://com.example.transporationsprovider/trains/

CとDの部分は省略化。ContentProviderのサブクラスの実装がこの部分をどう使うかは自由、だと思う。たぶん(作法はあるだろうけど)。

android.content.Contextクラス
public abstract ContentResolver getContentResolver()

android.content.ContentResolverクラス
public final InputStream openInputStream(Uri uri)
コンテントURIに関連するコンテントへのストリームをオープンする。

InputStream is = getContentResolver()
    .openInputStream(Uri.parse(
       "content://com.example.fileprovider.fileprovider/test.txt"));

byte[] buf = new byte[1024];
ByteArrayOutputStream out = new ByteArrayOutputStream();
int n;
while ((n = is.read(buf, 0, buf.length)) != -1) {
    out.write(buf, 0 ,n);
}

参考ページ:
3. コンテンツ プロバイダ - ソフトウェア技術ドキュメントを勝手に翻訳
ContentProviderでアプリ内のファイルを公開するサンプル - あられねこのめも

« 2点では物足りない、五輪予選マレーシア戦 | Main | 第27節、新潟終わった »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/52803023

Listed below are links to weblogs that reference Androidアプリ開発メモ022:コンテンツプロバイダ:

« 2点では物足りない、五輪予選マレーシア戦 | Main | 第27節、新潟終わった »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof