AndroidデータストアのContentProvider
6660 ワード
前のブログでは、自分のデータベースを生成する方法と、データベースの基本的な操作について説明しました.Androidシステムでは、連絡先やメールなど、URiを通じて多くのデータが検索されていることがわかりました.あなたのデータサポートをUriクエリで行うには、独自のContentProviderを実装する必要があります.
自分のContentProviderを作成する前に、自分のニーズが本当にContentProviderを実現する必要があるかどうかを明らかにしなければなりません.次の1つ以上のニーズを満たす場合は、自分のContentProviderを作成する必要があります.そうしないと、必要ありません.
1、あなたのアプリケーションは他のアプリケーションに複雑なデータを提供する必要があります.例えば、連絡先は、自分で連絡先データを使用する以外に、これらのデータをメールなどのアプリケーションを共有しなければなりません.
2、検索フレームワークにカスタム検索アドバイスを提供したい.
クエリーURIは、「scheme」、「authority」、「path」から構成され、id付きURIがテーブルの行に対応する選択可能な「id」セクションもあります.「scheme」は一般的に「content」として指定されます.各Provider間で競合が発生しないように、「authority」はアプリケーションのパッケージ名を使用することを推奨します.例えば、例では「com.ns.note」を使用します.「path」は表名に設定すればよい.URIを構築するには、次のようなUri.Builder()ツールクラスを使用します.
URIを使用してデータ照会を行う場合、表の「_id」フィールドがIDに等しい対応する行のデータを照会するために、URIにIDを接続することができます.以下のコードで示すように、URIのIDを解析することができます.
伝達されたURIがすべきことを明らかにするために、Provider APIは私たちにUriMatherクラスを提供してくれました.このクラスは事前に約束したルールに基づいて、URIを整数に一致させ、この整数に基づいて対応する操作を行い、対応するデータを返すことができます.
URIに一致するには、次のワイルドカードを使用します.
*:任意の長さの有効文字に一致します.
#:任意の長さに一致する整数文字("12");
以下に、ContentProviderの完全な例を示します.
説明:初めてまともにブログを書いたので、内容の組織があまりよくないかもしれませんが、ゆっくり修正して、自分が満足するまで知っています.
独自のContentProviderを構築する必要があるかどうか
自分のContentProviderを作成する前に、自分のニーズが本当にContentProviderを実現する必要があるかどうかを明らかにしなければなりません.次の1つ以上のニーズを満たす場合は、自分のContentProviderを作成する必要があります.そうしないと、必要ありません.
1、あなたのアプリケーションは他のアプリケーションに複雑なデータを提供する必要があります.例えば、連絡先は、自分で連絡先データを使用する以外に、これらのデータをメールなどのアプリケーションを共有しなければなりません.
2、検索フレームワークにカスタム検索アドバイスを提供したい.
あなたのクエリUriを設計
クエリーURIは、「scheme」、「authority」、「path」から構成され、id付きURIがテーブルの行に対応する選択可能な「id」セクションもあります.「scheme」は一般的に「content」として指定されます.各Provider間で競合が発生しないように、「authority」はアプリケーションのパッケージ名を使用することを推奨します.例えば、例では「com.ns.note」を使用します.「path」は表名に設定すればよい.URIを構築するには、次のようなUri.Builder()ツールクラスを使用します.
Uri CONTENT_URI = new Uri.Builder().scheme(SCHEME).authority(AUTHORITY).path(TABLE_NAME).build();
Content URIのIDの処理
URIを使用してデータ照会を行う場合、表の「_id」フィールドがIDに等しい対応する行のデータを照会するために、URIにIDを接続することができます.以下のコードで示すように、URIのIDを解析することができます.
long id = ContentUris.parseId(uri);
Content URIの照合
伝達されたURIがすべきことを明らかにするために、Provider APIは私たちにUriMatherクラスを提供してくれました.このクラスは事前に約束したルールに基づいて、URIを整数に一致させ、この整数に基づいて対応する操作を行い、対応するデータを返すことができます.
URIに一致するには、次のワイルドカードを使用します.
*:任意の長さの有効文字に一致します.
#:任意の長さに一致する整数文字("12");
private static final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
mUriMatcher.addURI(NotesContract.AUTHORITY, NotesContract.Notes.TABLE_NAME, NOTE);
mUriMatcher.addURI(NotesContract.AUTHORITY, NotesContract.Notes.TABLE_NAME + "/#", NOTE_ID);
}
以下に、ContentProviderの完全な例を示します.
package com.ns.sqlite;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
public class NotesProvider extends ContentProvider {
private MaikuDBHelper mDbHelper = null;
private static final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int NOTE = 1;
private static final int NOTE_ID = 2;
static {
mUriMatcher.addURI(NotesContract.AUTHORITY, NotesContract.Notes.TABLE_NAME, NOTE);
mUriMatcher.addURI(NotesContract.AUTHORITY, NotesContract.Notes.TABLE_NAME + "/#", NOTE_ID);
}
@Override
public boolean onCreate() {
mDbHelper = new MaikuDBHelper(getContext());
return true;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int result = -1;
int match = mUriMatcher.match(uri);
switch (match) {
case 1:
result = mDbHelper.getWritableDatabase().delete(NotesContract.Notes.TABLE_NAME, selection, selectionArgs);
break;
case 2:
long id = ContentUris.parseId(uri);
String where = NotesContract.Notes._ID + " = " + id;
if (selection != null && selection.trim().length()> 0) {
where = selection + " and " + where;
}
result = mDbHelper.getWritableDatabase().delete(NotesContract.Notes.TABLE_NAME, where, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unkwon Uri:" + uri.toString());
}
//
getContext().getContentResolver().notifyChange(uri, null);
return result;
}
@Override
public String getType(Uri arg0) {
int match = mUriMatcher.match(arg0);
switch (match) {
case 1:
return "vnd.android.cursor.dir/note";
case 2:
return "vnd.android.cursor.item/person";
default:
throw new IllegalArgumentException("Unkwon Uri:" + arg0.toString());
}
}
@Override
public Uri insert(Uri uri, ContentValues arg1) {
long id = mDbHelper.getWritableDatabase().insert(NotesContract.Notes.TABLE_NAME, null, arg1);
//
getContext().getContentResolver().notifyChange(uri, null);
return ContentUris.withAppendedId(NotesContract.Notes.CONTENT_URI, id);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
int match = mUriMatcher.match(uri);
switch (match) {
case 1:
cursor = mDbHelper.getReadableDatabase().query(NotesContract.Notes.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
break;
case 2:
long id = ContentUris.parseId(uri);
String where = NotesContract.Notes._ID + " = " + id;
if (selection != null && selection.trim().length() > 0) {
where = selection + " and "+ where;
}
cursor = mDbHelper.getReadableDatabase().query(NotesContract.Notes.TABLE_NAME, projection, where, selectionArgs, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("unknow uri" + uri.toString());
}
if (cursor != null) {
cursor.setNotificationUri(getContext().getContentResolver(), uri);
}
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int result = -1;
int match = mUriMatcher.match(uri);
switch (match) {
case 1:
result = mDbHelper.getWritableDatabase().update(NotesContract.Notes.TABLE_NAME, values, selection, selectionArgs);
break;
case 2:
long id = ContentUris.parseId(uri);
String where = NotesContract.Notes._ID + " = " + id;
if (selection != null && selection.trim().length() > 0) {
where = selection + " and " + where;
}
result = mDbHelper.getWritableDatabase().update(NotesContract.Notes.TABLE_NAME, values, where, selectionArgs);
break;
default:
throw new IllegalArgumentException("unknow uri" + uri.toString());
}
//
getContext().getContentResolver().notifyChange(uri, null);
return result;
}
}
続行.....説明:初めてまともにブログを書いたので、内容の組織があまりよくないかもしれませんが、ゆっくり修正して、自分が満足するまで知っています.