一、统一资源定位符(URI):
典型的URI结构如下:
content: // com.iotek.exampleprovider/ student/12
模式:内容URI的模式始终是content://
名空间:由ContentProvider来规定,用来区分不同的ContentProvider
路径:用来确定数据集合,可包含多个部分,每个部分由/隔开,一般由两个部分构成(student表示某个数据集合,12表示该数据集中某条数据)
二、ContentProvider的使用
1.访问ContentProvider
//获取一个ContentResolver实例
ContentResolver Context.getContextResolver();
2.ContentProvider查询
//ContentProvider查询
Cursor ContentResolver.query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder);
ContentProvider添加
//添加
Uri ContentResolver.insert(Uri uri,ContentValues values);
//修改
int ContentResolver.update(Uri uri,ContentValues values,String where,String[] selectionArgs);
//删除
int ContentResolver.delete(Uri uri,String where,String[] selectionArgs);
//访问通讯录的权限
<uses-permission
android:name="android.permission.READ_CONTACTS"/>
三、自定义ContentProvider
1.确保是否真的需要自定义ContentProvider,其他应用必须知道Uri和数据格式,所以自定义ContentProvider使用较少
2.自定义步骤一:
设计好本地数据结构:1>ContentProvider将本地数据封装成数据库的结构;2>本地数据一般用数据库实现(也可以对自定义文件解析)
实现一个ContentProvider的子类:1>这是安卓系统访问自定义数据的接口;2>实现增删改查的接口;3>在AndroidManifest.xml中注册
3.自定义步骤二:
自定义关键字符串:1>Uri是作为provider唯一的标识;2>外界通过数据库的形式访问,所以至少需要Column
其它的业务逻辑:1>网络同步;2>广播通知;3>日志上报
四、继承ContentProvider类
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
// 初始化工作,完成则返回true
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 返回查询结果,ContentResolver会收到
return null;
}
......
}
<provider
android:name="com.example.servicedemo.MyProvider"
android:authorities="com.example.servicedemo.forprovider"
android:exported="true"/>
></provider>
authorities即Uri
ContentResolver中使用Uri
Uri.parse("Content://"+"com.example.servicedemo.forprovider");