ContentProvider实现数据共享

(一)程序之间共享数据的方式
SharedPreferences,文件,SQLite数据库,ContentProvider
(二)ContentProvider简介
ContentProvider是不同应用程序之间进行数据交换的标准API.ContentProvider是以某种Uri的形式对外提供数据。允许其他应用访问或者修改数据,其他应用程序使用ContentResolver根据Uri去访问数据。
(三)开发ContentProvider的步骤
1.定义自己的ContentProvider类,该类继承ContentProvider基类
2.在AndroidManifest.xml文件注册这个ContentProvider,注册时需要为其绑定一个Uri
在<application>中添加如下
<!--下面配置中name数据指定ContentProvider类
authorities就相当于为该ContentProvider指定域名-->
<provider   android:name=".DrectProvider"
    android:authorities="org.crayit.providers.dictprovider"
    android:exported="true" />
CRUD操作
public boolean onCreate()  其它应用程序第一次访问ContentProvider时,回调该方法
public Uri insert(Uri uri, ContentValues  values)根据Uri插入values对应的数据
public int delete(Uri uri,String selection,String[] selectionArgs)根据Uri删除Selection条件所匹配的全部记录项
public int update(Uri uri,ContentValues value, String selection, String[] selectionArgs)根据Uri更新Selection条件所匹配的全部记录项
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
根据Uri查询Selection条件所匹配的全部记录项,其中projection是指定的数据列
public String getType(Uri uri)  返回当前Uri所代表的数据的MIME类型,如果该Uri对应数据包含多个选项,则返回值是vnd.android.cursor.dir/开头,如果是单条数据则是vnd.android.cursor.item开头
(四)ContentProvider的Uri简介
列如:
content://org.crazyit.providers.dictprovider/words


content://是android系统所规定的协议
org.crazyit.provider.dictprovider是ContentProvider的authorities
words则是资源部分

content://org.crazyit.providers.dictprovider/word/2
访问word数据中ID为2的记录
content://org.crazyit.providers.dictprovider/word/2/word
  访问word数据中ID为2的记录的word字段

大部分使用ContentProvider所操作的数据都来自于数据库,但有时也可以来自文件,XML或网络等其他存储方式
如下面的uri表示访问word节点下的detail节点
content://org.crazyit.providers.dictprovider/word/detail
为了将字符串装换成Uri,Uri工具提供了parse()静态方法
(五)使用ContentResolver操作数据
ContentResolver相当于HttpClient
通过getContentResolver()获取对应应用的ContentResolver对象
insert(Uri uri,ContentValues values)向Uri对应的CotentProvider中插入values对应的数据
delete(Uri uri,String where,String[] selectionArgs) 删除Uri对应的ContentProvider中Where提交匹配的数据
update(Uri uri,ContentValues values,String where,String[] selectionArgs)更新Uri对应的ContentProvider中where提交匹配的数据
query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
(六)ContentProvider与ContentResolver,Uri三者之间关系
ContentResolver向Uri执行CRUD操作
Uri则委托给该Uri对应的ContentProvider
ContentProvider则对数据进行相应的操作
(七)开发一个CotentProvider子类步骤
1.开发一个ContentProvider子类,该子类只需要实现query(),insert(),update()和delete()等方法
2.在AndroidManifest.xml文件中注册该ContentProvider,指定android:authorities属性


为了确定该ContentProvider实际能处理的Uri,以及确定每个方法中Uri参数所操作的数据。Android系统提供了UriMatcher类
UriMatcher主要提供如下两个方法
Void addURI(String authority,String path,int code) 向UriMathcer注册Uri,其中anthority和path组合成一个Uri
int match(Uri uri)根据掐面注册的Uri来判断Uri的标识码,如果未找到则返回-1
除此之外,Android还提供了ContentUris工具类
withAppendedld(uri ,id)   用于为路径加上ID部分
ParseId(Uri)从Uri路径中解析出ID
(八)ContentObserver监听ContentProvider的数据变化
只要ContentProvider的数据发生变化,即需要使用getContext().getContentResolver().nofifyChange(uri,null)通知所有注册在改Uri的监听器
        监听ContentProvider的数据变化,继承ContentObserver基类,重写onChange(boolean selfChange)
通过ContentResolver向指定Uri注册ContentObserver监听器
registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer)
uri:该监听器所监听的ContentProvider的Uri
notifyForDescendents 设置子目录是否允许通知
observer:监听器实例
getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new SmsObserver(new Handler()));
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值