1.内容提供者简介
内容提供者是Android中四大组件之一,用于保存和检索数据,是不同应用程序之间共享数据的接口。
ContentProvider是不同应用程序之间进行数据交换之间标准API,以Uri的形式对外提供数据,允许其他应用操作本应用数据。其他应用则使用ContentResolver,并根据ContentProvider提供的Uri操作指定数据。
A应用需要使用ContentProvider暴露数据,才能被其他应用操作。B应用必须通过ContentResolver操作A应用暴露出来的数据,而A应用会将操作结果返回给ContentResolver,然后ContentResolver再将操作结果返回给B应用。
2.创建内容提供者
在创建一个内容提供者时,首先需要定义一个类继承android.content包下的ContentProvider类。ContentProvider类是一个抽象类,子类需要重写它的onCreate()、delete()、getType()、insert()、query()、update()这几个抽象方法。
public class PersonDBProvider extends ContentProvider{
//创建ContentProvider调用
public boolean onCreate() {
return false;
}
//根据传入的Uri查询指定条件下的数据
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
//用于返回指定Uri代表数据的MIME类型
public String getType(Uri uri) {
return null;
}
//根据传入的Uri插入数据
public Uri insert(Uri uri, ContentValues values) {
return null;
}
//根据传入的Uri删除指定条件下的数据
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
//根据传入的Uri更新指定条件下的数据
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
}
注意:创建内容提供者类之后一定要在清单文件注册
<provider
android:name="com.example.db.PersonDBProvider"
android:authorities="com.example.db.personprovider" >
</provider>
3.Uri简介
Uri(Uniform Resource Identifier)统一资源定位符,Uri是由scheme、authorite、path三部分组成
scheme部分“content//:”是一个标准的前缀,表明这个数据被内容提供者所控制,它不会被修改。authorities部分“com.example.personprovider”是在清单文件中指定的android:authorities属性值,该值必须唯一,它表示了当前的内容提供者。path部分“/person”代表资源(或者数据),当访问者需要操作不用数据时,这个部分是动态改变的。
Uri.parse(String str)方法是将字符串转化成Uri对象的。为了解析Uri对象,Android系统提供了一个辅助工具类UriMatcher用于匹配Uri。
public UriMatcher(int code):创建UriMatcher对象时调用,参数通常使用UriMather.NO_MATCH,表示路径不满足条件返回-1。
public void addURI(String authority,String path,int code):添加一组匹配规则,authority即Uri的authoritites部分,path即Uri的path部分。
public int match(Uri uri):匹配Uri与addURI方法相对应,匹配成功则返回addURI方法中传入的参数code的值。
Uri uri = Uri.parse("content://cn.itcast.db.personprovider/person");
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, new String[] { "address", "date",
"type", "body" }, null, null, null);
while (cursor.moveToNext()) {
String address = cursor.getString(0);
long date = cursor.getLong(1);
int type = cursor.getInt(2);
String body = cursor.getString(3);
}
cursor.close();
ContentResolver对象的query()方法实现了对其他应用数据的查询功能,需要注意的是,这里的Uri只能提供查询操作,如果使用查询操作的Uri进行更新操作会抛异常。