AndroidデータストアのContentProvider

6660 ワード

前のブログでは、自分のデータベースを生成する方法と、データベースの基本的な操作について説明しました.Androidシステムでは、連絡先やメールなど、URiを通じて多くのデータが検索されていることがわかりました.あなたのデータサポートをUriクエリで行うには、独自の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;
	}

}
続行.....
説明:初めてまともにブログを書いたので、内容の組織があまりよくないかもしれませんが、ゆっくり修正して、自分が満足するまで知っています.