android之内容提供者解析
感谢chenzheng提供的文章讲解,此文转载http://blog.csdn.net/chenzheng_java/archive/2011/03/08/6232632.aspx
该系统有两个应用,比较繁琐。但是内容提供者是android里非常非常重要的一个内容,我们得好好学习下哦。先看效果图,我们提供了四个按钮,点击按钮便会进行相应的操作。
?
想说的话,在代码的注释中已经说的很清晰了。这里再次重复下我们定义和使用内容提供者的步骤吧。
定义内容提供者:
????? 我们定义内容提供者的目的是什么,共享数据,对,定义内容提供者的目的就是让别的应用能够访问当前应用的一些数据,至于到底暴露给外界什么数据,我们可以在定义内容提供者的时候详细控制!不管如何,我们明确了第一个问题,定义内容提供者的目的----数据共享!
????? 我们平时对数据的操作都有哪些?增删改查!就四个字!这也是为什么我们再定义内容提供者的时候必须要实现相应的方法了。当然如果你要是不想提供相应的操作,你可以在内部进行方法空实现。
???? 是不是所有的应用都可以访问我啊?不可能!我们可不是随便的人,对吧!所以我们要进行验证,验证不通过的直接让它去死就可以了。验证怎么验证啊?通过UriMatcher进行匹配!
???? 现在我们已经提供了访问接口了,我们怎么让系统知道,别的应用可以用我的东西啊?去配置文件中注册!!
使用内容提供者:
????? 如何找到该内容提供者啊?需要Uri和相应的访问权限。相当于地址
????? 如何进行增删查改啊?通过ContentResolver对象的相应方法。
?
两个工程见附件:(回头在研究)
注意:
? 1,ContentAccessActivity,通过访问内容提供者进行增删查改.注意本程序中为了方便阅读,??
?????? 在需要数据库列名的地方直接写上了数据库中字段的名称,实际上这是不合理的,??
?????? 作为内容提供者的使用者,我们不可能在使用这个内容提供者之前先去了解sqlite??
?????? 中表的结构。比较适宜的做法是,在内容提供者中将愿意提供给外部访问的字段名称(列名)??
?????? 定义为string final 的常量!
??2,MyContentProvider????
?????? 第一:我们要有一个uri,这就相当于我们的网址,我们有了网址才能去访问具体的网站??
?????? 第二:我们去系统中寻找该uri中的authority(可以理解为主机地址),??只要我们的内容提供者在manifest.xml文? 件中注册了,那么系统中就一定存在。??
?????? 第三:通过内容提供者内部的uriMatcher对请求进行验证(你找到我了,还不行,我还得看看你有没有权限访问我呢)。??
???????第四:验证通过后,就可以调用内容提供者的增删查改方法进行操作了?
? 3,?内容提供者是什么?内容提供者相当于一个封装好了增删改查操作的接口,这个接口有一把锁,只有携带钥匙的访问者才能访问,MyContentProvider继承ContentProvider实现相关操作,提供一个URI供ContentAccessActivity访问
?????? ContentResolver是什么?ContentResolver是一个开锁匠,他携带者钥匙(钥匙上有标签显示他是那个门得钥匙,如path_chenzheng)??去寻找内容提供者,然后访问内容提供者的增删查改方法,我们这里调用contentResolver的增删查改就相当于将任务交给了锁匠,然后让锁匠去找能打开的内容提供者,并且执行里面相应的方法,并将结果返回.??
?????????ContentResolver的好处在于,我们可以无视CotentProvider的具体实现,无论contentProvider里面是如何实现的,我想执行某一个操作时,所要书写的代码都是一样的。?ContentAccessActivity的resolver是通过URI进行关联后,操作MyContentProvider
?4,必须两个工程同时进行
?