Android独学の道--02:ContentProvider共有データ

7368 ワード

ContentProviderは、アプリケーション内のデータを他のアプリケーションに共有してアクセスできます.他のアプリケーションは、ContentProviderを使用してアプリケーション内のデータを追加削除することができます.メリットは、データへのアクセス方法が統一されていることです.
ContentProviderの使用方法
一、ContentProviderを継承して書き換えるには、public class PersonContentProvider extends ContentProvider{public boolean onCreate()データ化可能な初期化操作public Uri insert(Uriuri,ContentValue values)ContentProviderにデータpublic int delete(Uriuri,String selection,String[]selectionArgs)を挿入してContentProviderを削除
ContentProviderのデータの更新
                    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
//外部アプリケーションクエリーContentProviderのデータpublic Cursor query(Uriuri,String[]projection,String selection,String[]selectionArgs,String sortOrder)public String gettype(Uriuri uri)がオペレーションデータを返すコンテンツタイプ
            }
この方法は、現在のUrlで表されるデータのMIMEタイプを返すために使用される.操作データが集合型に属する場合、MIME型文字列はvndであるべきである.android.cursor.dir/先頭、たとえば、すべてのpersonレコードを取得するUriはcontent://cn.itcast.provider.personprovider/personでは、返されるMIMEタイプ文字列は「vnd.android.cursor.dir/person」です.操作するデータが非集合型データに属する場合、MIME型文字列はvndであるべきである.android.cursor.item/先頭、例えばidが10のpersonレコードが得られ、Uriはcontent://cn.itcast.provider.personprovider/person/10では、返されるMIMEタイプ文字列は「vnd.android.cursor.item/person」です.
二、AndroidManifestにいる必要がある.xmlはを使用してContentProviderを構成します.他のアプリケーションがContentProviderを見つけるために、ContentProviderはauthorities(ホスト名/ドメイン名)を使用して一意の識別を行います.ContentProviderをウェブサイトと見なすことができます(考えてみれば、ウェブサイトもデータ提供者です).authoritiesは彼のドメイン名です.
<manifest .... >
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".PersonContentProvider"         
            android:authorities="cn.meng.providers.personprovider"/>
    </application>
</manifest>

書き換え方法にUriがあるのを見た.では、Uriをご紹介します.
Uri
Uriは操作するデータを表し、Uriは主に2つの部分の情報を含んでいる:1』操作が必要なContentProvider、2』はContentProviderの中のどんなデータに対して操作を行い、1つのUriは以下のいくつかの部分から構成されている:
    content://cn.meng.providers.personprovider/person/10
personテーブルのidが10であるレコードを操作することを示す.
ContentProvider(コンテンツプロバイダ)のschemeはAndroidによって規定されており、schemeはcontent://ホスト名(またはAuthority)でこのContentProviderを一意に識別するために使用され、外部呼び出し者はこの識別に基づいて見つけることができる.パス(path)は、私たちが操作するデータを表すために使用することができ、パスの構築はビジネスによって決まる.以下のように、personテーブルのidが10のレコードを操作するには、/person/10 personテーブルのidが10のレコードのnameフィールドを操作し、person/10/nameはpersonテーブルのすべてのレコードを操作し、このようなパスを構築することができる:/personはxxxテーブルのレコードを操作し、このようなパスを構築することができる:/xxxはもちろん操作するデータが必ずしもデータベースから来ているわけではない、ファイル、xmlまたはネットワークなどの他の記憶方式であってもよい.以下のように、xmlファイル中のpersonノードの下のnameノードを操作するには、/person/nameが1つの文字列をUriに変換する場合、Uriクラス中のparse()メソッドを使用して、以下のようにすることができる:Uri uri=Uri.parse("content://cn.itcast.provider.personprovider/person")
UriMatcher
Uriは操作するデータを表すため,Uriを解析し,Uriからデータを取得することがしばしば必要である.Androidシステムは、Uriを操作するための2つのツールクラスを提供しています.それぞれUriMatcherとContentUrisです.それらの使用を把握すると、私たちの開発作業に便利になります.UriMatcherクラスはUriをマッチングするために使用されます.その使い方は以下の通りです.1、まず最初のステップでは、Uriパスをすべて登録する必要があります.以下のようにします.
//  UriMatcher.NO_MATCH             
UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//  match()    content://cn.itcast.provider.personprovider/person  ,      1
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1);
//      uri,           
//  match()    content://cn.itcast.provider.personprovider/person/230  ,      2
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);//#     
switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) { 
   case 1
    break;
   case 2
    break;
   default://   
    break;
}

一致するUriを登録したら、sMatcherを使用できます.match(uri)メソッドは入力したUriをマッチングし,マッチングするとマッチングコードを返し,マッチングコードはaddURI()メソッドを呼び出して入力した3番目のパラメータであり,マッチングを仮定するcontent://cn.itcast.provider.personprovider/personパス、返される一致コードは1です.
ContentUris
ContentUrisクラスはUriパスの後ろのID部分を取得するために使用され、2つの比較的実用的な方法がある:1、withAppendedId(uri,id)はパスにID部分を加えるために使用される:Uri uri=Uri.parse("content://cn.itcast.provider.personprovider/person")Uri resultUri=ContentUris.withAppendedId(uri,10);//生成後のUri:content://cn.itcast.provider.personprovider/person/102.parseId(uri)メソッドは、パスからID部分:Uriuri=Uriを取得する.parse("content://cn.itcast.provider.personprovider/person/10")long personid=ContentUris.parseId(uri);//取得結果:10
ContentResolver外部アプリケーションがContentProviderのデータを追加、削除、変更、クエリーする必要がある場合は、ContentResolverクラスを使用して完了できます.ContentResolverオブジェクトを取得するには、Activityが提供するgetContentResolver()メソッドを使用します.ContentResolverクラスには、ContentProviderクラスと同じ署名の4つのメソッドが用意されています.このメソッドは、ContentProviderにデータを追加するためのpublic Uri insert(Uriuri,ContentValue values)です.public int delete(Uriuri,String selection,String[]selectionArgs)ContentProviderからデータを削除する方法です.public int update(Uriuri,ContentValue,String selection,String[]selectionArgs)ContentProviderのデータを更新する方法です.public Cursor query(Uriuri,String[]projection,String selection,String[]selectionArgs,String sortOrder)ContentProviderからデータを取得する方法.これらの方法の最初のパラメータはUriであり、操作するContentProviderとその中のどのデータを操作するかを表し、与えられたものはUriであると仮定する.parse(“content://cn.itcast.providers.personprovider/person/10)を選択すると、ホスト名はcnとなります.itcast.providers.personproviderのContentProviderが操作し,操作したデータはpersonテーブル中のidが10のレコードである.
ContentResolverを使用して、ContentProviderのデータの追加、削除、変更、クエリーを行います.
ContentResolver resolver =  getContentResolver();
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
//      
ContentValues values = new ContentValues();
values.put("name", "itcast");
values.put("age", 25);
resolver.insert(uri, values);        
//  person      
Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
while(cursor.moveToNext()){
    Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
}
// id 1    name       liming
ContentValues updateValues = new ContentValues();
updateValues.put("name", "liming");
Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
resolver.update(updateIdUri, updateValues, null, null);
//  id 2   
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);

ContentProviderデータの変更を監視
ContentProviderのアクセス者がContentProviderのデータの変化を知る必要がある場合は、ContentProviderのデータの変化時にgetContentResolver()を呼び出すことができる.notifyChange(uri,null)は、このURIに登録されている訪問者に通知し、例は以下の通りである.
public class PersonContentProvider extends ContentProvider {
    public Uri insert(Uri uri, ContentValues values) {
        db.insert("person", "personid", values);
        getContext().getContentResolver().notifyChange(uri, null);
    }
}

ContentProviderのアクセス者がデータ変更通知を取得する必要がある場合は、ContentObserverを使用してデータ(データはuri記述)をリスニングする必要があります.データ変更通知を監視すると、ContentObserverのonChange()メソッドが呼び出されます.
getContentResolver().registerContentObserver(
    Uri.parse("content://cn.itcast.providers.personprovider/person"),true,
    //true         Uri                ,
    //    uri        uri          
                     new PersonObserver(new Handler()));
public class PersonObserver extends ContentObserver{
    public PersonObserver(Handler handler) {
        super(handler);
     }
    public void onChange(boolean selfChange) {
        //             
    }
}