Android是如何实现应用程序之间数据共享的?一个应用程序可以创建自己的数据,这个数据对该应用程序来说是私有的,外界更本看不到,
也不知道数据是如何
存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交道,例
如:添加(insert)、删除(delete)、查询(query)、修改(update)。
android为我们提供了ContentProvider来实现数据的共享,一个程序如果想让别的程序可以操作自己的数据,就定义自己的
ContentProvider,然后在AndroidManifest.xml中注册,其他application可以通过获取
ContentResolver通过Uri来操作上一程序的数据。
android中的电话本等数据就是通过ContentProvider实现数据共享的,系统中有很多已经存在的共享Uri。我们可以使用ContentResolver通过Uri来操作不同表的数据;如Contacts.People.CONTENT_URI
什么是URI?
将其分为A,B,C,D 4个部分:
A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://"
B:URI的标识,它定义了是哪个Content
Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。这个标识在 元素的
authorities属性中说明:一般是定义该ContentProvider的包.类的名称
;"content://hx.android.text.myprovider"
C:路径,不知道是不是路径,通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就ok了;"content://hx.android.text.myprovider/tablename"
D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部;
"content://hx.android.text.myprovider/tablename/#" #表示数据id
这里主要是说明如何创建自己的ContentProvider,这里有几个常用的类
UriMatcher:用于匹配Uri,它的用法如下:
1.首先把你需要匹配Uri路径全部给注册上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符
2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用
addURI()方法传入的第三个参数,假设匹配
content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配
码为1。
ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
· withAppendedId(uri, id)用于为路径加上ID部分
· parseId(uri)方法用于从路径中获取ID部分
其他要用到的类程序中已添加说明
自己写了一个小的测试程序,附在下面有想了解的可以看一下
程序是基于同一个application的。
对应自定义ContentProvider的使用找到以下资料:
转自http://blog.chinaunix.net/u3/90973/showart_2161195.html
ContentProvider是什么时候创建的,是谁创建的?访问某个应用程序共享的数据,是否需要启动这个应用程序?这个问题在
Android
SDK中没有明确说明,但是从数据共享的角度出发,ContentProvider应该是Android在系统启动时就创建了,否则就谈不上数据共享了。
这就要求在AndroidManifest.XML中使用元素明确定义。
可能会有多个程序同时通过ContentResolver访问一个ContentProvider,会不会导致像数据库那样的“脏数
据”?这个问题一方面需要数据库访问的同步,尤其是数据写入的同步,在AndroidManifest.XML中定义ContentProvider的时
候,需要考虑是元素multiprocess属性的值;另外一方面Android在ContentResolver中提供了notifyChange()
接口,在数据改变时会通知其他ContentObserver,这个地方应该使用了观察者模式,在ContentResolver中应该有一些类似
register,unregister的接口。
至此,已经对ContentProvider提供了比较全面的分析,至于如何创建ContentProvider,可通过2种方法:创建一个属于你自己的
ContentProvider或者将你的数据添加到一个已经存在的ContentProvider中,当然前提是有相同数据类型并且有写入
Content provider的权限。
相关推荐
Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...
contentprovider
1、Android Room操作SQLite数据 2、ContentProvider使用,使用Room进行数据库操作
androdi ContentProvider和Uri详解
android 自定义 ContentProvider 以及 ContentResolver
两个apk之间通过Broadcast,BroadcastReceiver广播互相通信及ContentProvider监听数据库增删改查的变换
介绍ContentProvider使用方法,包括最简单的用法,一个项目中创建多个ContentProvider分别操作数据库表,以及一个ContentProvider操作多张数据库表的用法。
contentProvider 的使用以及总结
ContentProvider自定义以及使用系统ContentProvider
该文件中有两个应用,db应用通过ContentProvider对外提供数据共享,other应用提供测试代码对数据进行增删改查。 参考博客:http://blog.csdn.net/tan313/article/details/44338425
现在请数一数你的手机中一共有多少...这个时候Contentprovider就排上用场了,Contentprovider能够在各个app之间进行数据的共享和传递,让信息不再成为孤岛,从这个意义上讲,你还能有不去学习Contentprovider的理由吗?
android 数据库 以及自定义ContentProvider demo
ContentProvider 共享SharedPreferences 值
android contentprovider使用示例
Android学习ContentProvider数据更新与Observer模式一Observer模式意图: 定义对象之间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被更新。 依赖(Dependents)、发布-...
contentProvider监听的例子
用SharePreferences作数据存储做了一个ContentProvider实现数据共享
Android知识点ContentProvider篇
AsyncQueryHandler及ContentProvider的使用,异步查询数据 显示在listview里面,及其常用的Adapter的用法,