Android中contentprovider详解
来源:互联网 发布:网络播放器哪个好用 编辑:程序博客网 时间:2024/06/09 20:08
Android中contentprovider详解
1.初识ContentProvider
ContentProvider是android四大组件之一。它是不同应用程序之间交换数据的标准api(前面提到各个activity之间的通讯是Intent),ContentProvider以某种uri的形式对外提供数据,允许其它应用程序对其访问或者修改数据,其它应用程序使用ContentResolver根据Uri去访问操作指定数据。
向android系统中注册ContentProvider只需在<application/>中添加如下子元素:
<providerandroid:name=".Dictprovider" ---指定ContentProvider类
android:authorities="org.crazyit.providers.dictprovider"--为ContentProvider指定域名
android:exported="true"/>
(Dictprovider需要继承ContentProvider基类)
2.初识Dictprovider的方法
应用程序对数据的操作无非就是CRUD(增删改查),所以Dictprovider提供以下方法:
public booleanonCreate()
该方法在ContentProvider创建后会被调用,当其它应用程序第一次访问ContentProvider时,该ContentProvider会被创建出来,并立即回调该onCreate()方法。
public Uri insert(Uriuri,ContentValues values)
根据该uri插入对应的数据
public int delete(Uriuri,String selection,String[] selectionArgs)
根据该uri删除select条件所匹配的全部记录
public int update(Uriuri,ContentValues values,String selection,String[] selectionArgs)
根据该uri修改select条件所匹配的全部记录
public Cursor query(Uriuri,String[] projection,String selection,String[] selectionArgs,StringsortOrder)
根据uri查询出select条件所匹配的全部记录,其中projection就是个一个列名列表,表明只选择出指定的数据列
public String getType(Uriuri)
用于返回当前uri所代表的数据的MIME类型。如果该uri对应数据可能包括多条数据,那么MIME类型字符串应该以vnd.android.cursor.dir开头
3.uri简介
uri的组成就像我们平常访问的网络http://www.baidu.com/index.jsp一样。
比如该uri:content://org.crazyit.providers.dictprovider/words
对于这个uri,可分为如下三个部分:
->content:// :这个部分是android的ContentProvider规定的,就像上网的协议默认是http://一样
->org.crazyit.providers.distprovider:这个部分就是ContentProvider的域名(authority)
->words 资源部分,当访问者需要访问不同资源时,这个部分是动态改变的
uri还可以这样表达:
content://org.crazyit.providers.dictprovider/word/2(此时它要访问的资源为word/2,这意味着访问word数据中ID为2的记录的word字段)
content://org.crazyit.providers.dictprovider/word/2/word(此时它要访问的资源是word/2,这意味着访问word数据中ID为2的记录的word字段)
content://org.crazyit.providers.dictprovider/words(访问全部数据)
content://org.crazyit.providers.dictprovider/word/detail/(数据来源于文件、xml等。表示操作word节点下的detail节点)
uri工具类提供了parse()静态方法:将一个字符串转换成uri:Uri uri=Uri.parse("content://org.crazyit.providers.dictprovider/word/2")
4.使用contentResolver操作数据(一般是单实例的)
ContentProvider是暴露该应用程序的数据,那么其它应用程序则通过contentResolver操作数据。
context通过getContentResolver()来得到contentResolver对象,然后就可以调用contentResolver的方法来操作数据:
insert(Uri uri,ContentValues values):向Uri对应的ContentProvider中插入values对应的数据
delete(Uri uri,String where,String[]selectArgs):删除Uri对应的ContentProvider中where提交匹配的数据。
update(Uri uri,ContentValues values,Stringwhere,String[] selectArgs):更新Uri对应的ContentProvider中where提交匹配的数据
query(Uri uri,String[] projection,Stringselection,String[] selectionArgs,String sortOrder):查询Uri对应的ContentProvider中where提交匹配的数据
5.COntentResolver与ContentProvider的关系
从ContentResolver、ContentProvider和Uri的关系来看,无论是ContentResolver还是Contentprovider,它们所提供的CRUD方法的第一个参数都是Uri。也就是说,Uri是ContentResolver和ContentProvider进行数据交换的标示。ContentResolver对指定的Uri进行CRUD等操作,但Uri并不是真的数据中心,因此这些CRUD操作会委托给该Uri对应的ContentProvider来实现。比如说:假如A应用通过ContentResolver执行CRUD操作,这些CRUD操作都需要指定Uri参数,android系统就根据该uri找到对应的Contentprovider(该Contentprovider通常属于B应用),Contentprovider则负责实现CRUD方法,完成对底层数据的增删改查等操作,这样就可以让A应用访问、修改B应用的数据
6创建ContentProvider时的说明
前面提到contentResolver对指定的Uri进行CRUD操作,这些操作会委托给该Uri对应的Contentprovider来实现,但实际上,ContentProvider会对该Uri进行判断,为了确定该ContentProvider实际能处理的Uri,以及确定每个方法中的Uri参数所操作的数据,android系统提供了UriMatcher工具类。该类提供了如下两个方法:
->void addURI(String authority,Stringpath,int code):该方法用于向UriMatcher对象注册Uri。其中authority和path组合成一个Uri,而code则代表该uri对应的标识码
->int match(Uri uri):根据前面注册的Uri来判断指定Uri对应的标识码。如果找不到匹配的标识码,该方法将会返回-1
android还提供了一个ContentUris工具类,可操作Uri
->withAppendedld(uri,id)用于为路径加上ID部分
7.监听ContentProvider
在有些时候,应用程序需要实时监听所共享数据的改变,并随着ContentProvider共享数据的改变而做出响应,这时就需要用到ContentObserver。监听ContentProvider数据改变的监听需要继承ContentProvider类,并重写该基类所定义的onChange(booleanselfChange)方法-当它所监听的ContentProvider的数据发生改变时,该onChange会被触发
为了监听指定ContentProvider数据变化,需要通过ContentResolver向指定Uri注册ContentObserve监听器。ContentResolver提供以下方法来注册监听器:
registerContentObserver(Uri uri,booleannotifyForDescendents,contentObserver observer)
->uri :该监听器所监听的ContentProvider的uri
->notifiForDescendents :如果该参数设为true,假如注册监听的uri为content://abc,那么uri为content://abc/xyz\content://abc/xyz/foo的数据改变时,也会触发该监听器;反之则只有content://abc的数据发生变化时才会触发监听器
->observer :监听器实例
例如:getContentResolver().registerContentObserver(Uri.parse("content://sms",true,newSmsObserver(new Handler())))
- Android中contentprovider详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider详解例程
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- 【Android】Android中ContentProvider组件详解
- Android 中ContentProvider和Uri详解
- Android 中ContentProvider和Uri详解
- Android中内容提供者ContentProvider的详解
- Android中ContentProvider和Uri详解
- shell中sed命令失灵,又一个坑。。。
- QT编程-day2
- 23种设计模式(1):单例模式
- Android 判断应用程序获取通知栏权限是否开启,以及如何跳转到应用程序设置界面
- redis 事务
- Android中contentprovider详解
- poj 3104 Drying
- 【啊哈!算法】算法5开启“树”之旅
- ubuntu设置快捷启动PyCharm--Pycharm.desktop
- mybatis映射
- jzoj P1667【coci2011/2012 1】PLES
- React初始化函数简单的介绍
- Windows下安装python以及常用的IDE Eclipse
- MyBatis和Hibernate比较