コンテントプロバイダ(ContentProvider)とは
各アプリケーションがアプリ内部にもつオブジェクト
- リレーショナルデータベースのように行・列(表)として表示される。
- 同一端末内のアプリ間でデータのやり取りが生じる際はこのオブジェクトを利用する。
- プロバイダへのアクセスはContentResolverというクライアントオブジェクトを利用する。(CRUD操作が行えるクライアントオブジェクト)
- プロセス間通信、安全なデータアクセスを処理するための実装が行われている。
コンテントプロバイダ(ContentProvider)のデータ
- _IDがプライマリーキー
プロバイダへのアクセス
- 通常AndroidManifestにパーミッションが必要
mCursor = getContentResolver().query(
UserDictionary.Words.CONTENT_URI, //テーブルのuriの指定
mProjection, // 各行で返すべきカラム
mSelectionClause // 条件
mSelectionArgs, // 条件
mSortOrder // ソート条件
);
- SQL SELECTとの比較
コンテンツURI
プロバイダのデータ・リソースを特定するためのURI
- プロバイダは複数のデータをもつので、リソースの居場所を明示的にする必要がある。そのために利用されるのがURI。RestにおけるURIリソースのようなもの
URI | スキーム | 認証局 | パス |
---|---|---|---|
content://user_dictionary/words | content | user_dictionary | words |
https://finc.co.jp/recruit | https | finc.co.jp | recruit |
手順
1. プロバイダの読み取りアクセスを要求する
2. プロバイダにクエリを送信するコードを定義
SQLインジェクション
SQLインジェクションを防ぐために
1. "?"の置き換えパラメータを利用する
2. 選択引数の配列を利用する。
Cursor.queryの返り値はCursorオブジェクト
クエリの結果を取得する。
int index = mCursor.getColumnIndex(UserDictionary.Words.WORD);
if (mCursor != null) {
//データベースから各行をループで取得
while (mCursor.moveToNext()) {
newWord = mCursor.getString(index);
}
}
Intent経由のデータアクセス
- URIにパーミッションを含めて、アプリケーションにインテントを送信する。
読み取りパーミッション: FLAG_GRANT_READ_URI_PERMISSION
書き込みパーミッション: FLAG_GRANT_WRITE_URI_PERMISSION
※ アクセスはURI自身に限定されるので、ContentProvider全てに適用されるわけではない。