Android—ContentProvider

ContentProvider介绍

ContentProvider内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作

当应用需要通过ContentProvider对外共享数据时需要以下几步:

1.      创建一个数据源,例如继承SQLiteOpenHelper创建一个SQLite数据库;

2.      创建一个继承自ContentProvider的类,并重写insert、delete、query、update、getType、onCreate方法,在这些方法中实现对数据源的操作;

3.     AndroidManifest.xml文件中添加<provider>标签,两个必写的属性是android:nameandroid:authorities(主机名/域名);

        <providerandroid:name="ContactsProvider2"

            android:authorities="contacts;com.android.contacts"

            android:label="@string/provider_label"

            android:multiprocess="false"

            android:exported="true"

            android:readPermission="android.permission.READ_CONTACTS"

            android:writePermission="android.permission.WRITE_CONTACTS">

</provider>

4.     在本应用或者其它应用的Activity、Service等组件中使用ContentResolver通过对应的URI来操作该自定义ContentProvider

URI介绍

Uri代表了要操作的数据,Uri主要包含了两部分信息:

1)需要操作的ContentProvider

2)对ContentProvider中的什么数据进行操作。

一个Uri由以下几部分组成:



ContentProviderscheme已经有Android所规定scheme为:content://

主机名或authorities用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

路径(path)用来标识我们要操作的数据。

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri =Uri.parse("content://com.android.contacts/rawcontact")。

UriMatcher类使用介绍

Android提供了两个用于操作Uri的工具类,分别为UriMatcherContentUris

UriMatcher用于匹配Uri

1. 通过new  UriMatcher(UriMatcher.NO_MATCH); 实例化,常量NO_MATCH作为参数表示不匹配任何URI;

2. 实例化后调用addURI方法注册URI,该方法有三个参数,分别需要传入URI字符串的authority部分、path部分以及自定义的整数code三者;

        matcher.addURI(ContactsContract.AUTHORITY, "contacts", CONTACTS);

        matcher.addURI(ContactsContract.AUTHORITY, "contacts/#", CONTACTS_ID);

        matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/data", CONTACTS_ID_DATA);

3. 在其它地方调用match方法匹配相应的URI,需要传入Uri作为唯一的参数,返回上述自定义的code值。

final int match =sUriMatcher.match(uri);

switch (match) {

            caseSYNCSTATE:

            casePROFILE_SYNCSTATE:

break;

            caseCONTACTS: {

break;

            } . .. . . .

ContentsUris使用介绍

ContentUris类用于操作Uri路径后面的ID部分,它有两个比较实用的方法:
withAppendedId(uri, id)用于为路径加上ID部分:

 Uri contactUri =ContentUris.withAppendedId(Contacts.CONTENT_URI,contactId);

parseId(uri)方法用于从路径中获取ID部分:

long rawContactId =ContentUris.parseId(rawContactUri);

使用ContentResolver操作ContentProvider

     当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver类提供了与ContentProvider类相同签名的四个方法:

         public Uri insert(Uriuri,ContentValues values):该方法用于往ContentProvider添加数据。

       publicint delete(Uriuri, String selection,String[]selectionArgs):该方法用于从ContentProvider删除数据。
public int update(Uriuri,ContentValues values, Stringselection, String[]selectionArgs):该方法用于更新ContentProvider中的数据。
public Cursorquery(Uri uri, String[]projection, String selection, String[]selectionArgs, StringsortOrder):该方法用于从ContentProvider中获取数据。

监听ContentProvider中的数据变化

     如果ContentProvider的访问者需要知道ContentProvider中的数据发生变化,可以在ContentProvider发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者。

如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(数据采用uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserveronChange()方法。

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值