ContentProvider介绍
ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。
当应用需要通过ContentProvider对外共享数据时需要以下几步:
1. 创建一个数据源,例如继承SQLiteOpenHelper创建一个SQLite数据库;
2. 创建一个继承自ContentProvider的类,并重写insert、delete、query、update、getType、onCreate方法,在这些方法中实现对数据源的操作;
3. 在AndroidManifest.xml文件中添加<provider>标签,两个必写的属性是android:name和android: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由以下几部分组成:
ContentProvider的scheme已经有Android所规定scheme为:content://
主机名或authorities用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)用来标识我们要操作的数据。
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri =Uri.parse("content://com.android.contacts/rawcontact")。
UriMatcher类使用介绍
Android提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris。
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描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的onChange()方法。