ContentResolver 与 ContentProvider 的做用android
ContentProvider 负责:sql
组织应用程序数据数据库
向其余应用程序提供共享数据安全
ContentResolver 负责ide
获取ContentProvider提供的数据.net
增删改查 数据线程
让本身的数据和其它应用程序共享有两种方式:建立本身的Content Provider (即继承自Content Provider的子类) 或者是将本身的数据添加到已有的Content Provider中去,后者须要保证现有的Content Provider和本身的数据类型相同而且具备该 Content Provider的写入的权限。
(1) 创建数据的存储系统
数据的存储系统能够由开发人员任意决定,通常来说,大多数的Content Provider都经过Android的文件存储系统或SQLite 数据库创建本身的数据存储系统。
(2)扩展 ContentProvider类sqlite
开发一个继承自ContentProvider类的 子类代码来扩展 ContentProvider类,在这个步骤主要的工做是将要共享的数据包装并以ContentResolver 和 Cursor对象可以访问到的形式对外展现。具体来讲须要实现ContentProvider 类中的6个抽象方法。
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):将查询的数据以Cursor 对象的形式返回。
Uri insert(Uri uri, ContentValues values):向 Content Provider中插入新数据记录,ContentValues 为数据记录的列名和列值映射。
int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):更新Content Provider中已存在的数据记录。
int delete(Uri uri, String selection, String[] selectionArgs):从Content Provider中删除数据记录。
String getType(Uri uri):返回Content Provider中的数据( MIME )类型。
boolean onCreate():当 Content Provider 启动时被调用。
以上方法将会在ContentResolver 对象中调用,因此很好地实现这些抽象方法会为ContentResolver提供一个完善的外部接口。除了实现抽象方法外,还能够作一些提升可用性的工做。
简言之,本身APP定义一个 ContentProvider的子类,并实现其中的方法后(在这些方法中对本身分享的数据如sqlite或文件等进行操做),就将这个ContentProvider“贡献”出去了。其余APP就能对这个ContentProvider进行增删查改的操做了。
定义一个 URI 类型的静态常量,命名为CONTENT_URI。 必须为该常量对象定义一个惟一的URI字符串,通常的作法是将 ContentProvider子类的全称类名做为URI字符串,如: "content://wyf.wpf.MyProvider"。(Android系统中可能不少APP提供了ContentProvider,各自要有各自的URI,不能同名)
定义每一个字段的列名,若是采用的数据库存储系统为SQLite 数据库,数据表列名能够采用数据库中表的列名。无论数据表中有没有其余的惟一标识一个记录的字段,都应该定义一个"_id"字段 来惟一标识一个记录。模式使用 "INTEGER PRIMARY KEY AUTOINCREMENT" 自动更新 通常将这些列名字符串定义为静态常量, 如"_id"字段名定义为一个名为"_ID" 值为 "_id" 的静态字符串对象。(无论本身分享给ContentProvider的源数据是sqlite仍是文件,最后都要整理成sqlite数据的形式提供给其余APP操做 )
(3)在应用程序的AdnroidManifest.xml 文件中声明Content Provider组件。
建立好一个Content Provider必需要在应用程序的AndroidManifest.xml 中进行声明,不然该Content Provider对于 Android系统将是不可见的。(艾玛,你好人好事都作好了,总得说一声吧,否则别人哪能知道)若是有一个名为MyProvider的类扩展了 ContentProvider类,声明该组件的代码以下:
<provider name="wyf.wpf.MyProvider"
authorities="wyf.wpf.myprovider"
...../> <!-- 为<provider>标记添加name、authorities属性-->
其中name属性为ContentProvider 子类的全称类名,authorities 属性惟一标识了一个ContentProvider。还能够经过 setReadPermission() 和setWritePermission() 来设置其操做权限。固然也能够再上面的 xml中加入 android:readPermission 或者 android: writePermission属性来控制其权限。
注意:由于ContentProvider可能被不一样的进程和线程调用,因此继承ContentProvider后所实现的那些方法必须是线程安全的。
参考资源 :http://blog.csdn.net/berber78/article/details/17680697xml