安卓SQLite和内容提供者(ContentProvide)史上最通俗和深入

来源:互联网 发布:张北云计算招聘2017 编辑:程序博客网 时间:2024/05/20 18:46
内容提供者是安卓的四大组件之一,我们经常说能位列四大天王的之一的人物能耐绝对不小,今天小马哥我就以电视剧人物的关系和来和各位鲜明深动的剖析内容提供者的点点滴滴,以前理解的朋友可以看这个增加记忆和深入理解,不理解的可以一目了然哦:
我们就以康熙王朝的康熙和朱三太子的案例深入剖析,当然首先我们要人物闪亮登场:
人物定位:
朱三太子:反清复明应用程序
康熙:    保我大清应用程序(和上面的不是一个应用程序)
小毛子:  内容提供者(ContentProvide).java,大内总管(作用:暴露康熙的私有数据)
小凳子:  ContentResolver 机灵接口小太监 (作用:直接操作数据)

人物关系:康熙和小毛子是一个应用程序的(在皇宫)
                 朱三太子是另外一个应用程序的(在三郎香会)
首先我们说朱三太子是干嘛的?当然是反清复明的,那他反清复明,他得做准备工作啊,他得从皇宫康熙那里获得一些信息,或者透露些不好的信息,那各位说他能直接康熙的书房(数据库)或者给康熙透露些信息吗?当然不行,然而我们的朱三太子毕竟是朱重八的子孙,多少还是有点脑子的,他多年前就在康熙的身边安插了小毛子(内容提供者)这么个宝,现在都是大内总管了,他从康熙那获取信息就很方便了,详情请参阅下面:更下精彩,更加鲜明

那么好:首先我们来创建两个应用程序


创建一个数据库他是需要有帮助的,康熙老爷子要建书房是不是得下圣旨让懂行的来布局啊,所谓一个好汉三个帮,所以这里面也需要一个类SQLiteOpenHelper,从字面理解,这个类就是SQLite的打开帮助的那么一个类,这个类的作用呢,就是用来打开和创建数据库,我们一般是创建一个类来继承这个类,如下:包含两个方法:1:onCreate(),创建数据库的时候调用,2:onUpgrade数据库更新版本的时候调用,因为onCreate()方法是在数据库创建的时候被调用,我们就在onCreate()这个方法下面创建表,(数据库创建我们一般在单元测试框架里面)




为了方便测试,通常我们会把数据库的创建单元测试框架里面,创建一个类,让他继承

AndroidTestCase;下面的方法可以随便定义,我们就取名test,这里面有两点需要注意的,一个是同名数据库只会创建一次,然后通过getWritableDatabase()获取读写的权利,第二个就是数据库的升级,数据库那个级数升了是不能降的


当然这个单元测试框架我们也是要在xml清单文件配置的,不然他是不知道他是要测试那个应用的,就像我这个(书房)数据库是建在哪的,地址不能乱建啊,我是建在乾清宫给康熙老爷子的

所以这里的第二行android:targetPackage="com.example.zdycontentProvider"要指明是服务那个应用的项目,这两天条件都要写,其他两个name都是默认的



接下来创建数据库和表,我们可以选中test,右键运行Android JUnt Test,好了,表和数据库都有了(因为我表是在oncreat方法下创建的,数据库创建他就调用)

好了,康熙老爷子的书房在一个月的工期后如期的交差了:那朱三太子想给康熙渗透些正统的思想又或者说想到书房机密修改一些信息,他是不是得通过康熙身边的奸细大内总管ContentProvide把信息数据暴露出来,不然他怎么得到,是不是,但是你想,大内总管要暴露这个信息数据,是不是得具备某些功能和本事,你普通人去和康熙说这些话,或者偷听这些信息有多少脑袋不够砍的,ContentProvide这哥们混到大内总管,有几大杀手锏,现在就有请我们大内一号总管闪亮登场:






大家看完这些代码,要注意那个传入的参数uri,那是个非常重要的东西,好了

这哥们我们必须要隆重介绍,毕竟靠自己的努力位极人臣,在三太子和康熙两边左右逢源的人可不是一般的人,首先这哥们有多个方法,要算厉害的是四个杀手锏,分别是insert,delete,update,query;就凭这个他可以在自如的把康熙的私有数据完全暴露在外,朱三太子就有机可趁了,这个哥们要行使这些,还是要在清单文件注册的(安卓四大组件都要在xml文件注册),以示我是合法的,这里面的authorities非常重要,这个是内容提供者的身份的证明(我们这里是自定义的),也就是说我们这位总管目前来说,虽然在清廷劳苦功高,但是他还是外编的,官方解释就是内容提供者的主机名,上面我让大家注意的那个传入的参数uri就是这个东西,name就定全额名称,下面那个exported照写



好了,皇宫那边一切稳妥了,朱三太子这边他也要有动静啊,这么大的项目,他得成立指挥中心吧?上面我们创建过朱三太子这个应用程序

好了,不多说,直接创建指挥中心,打开xml布局文件,添加四个指挥按钮的onclick事件



界面如下:


在MainActivity(指挥中心)这边,请看,首先设置点击方法:

好了,各位看官,让我来带领你们看看三郎相会是什么样子的,请把目光移至第27个座位(行),这个接口哥们就是前面在人物介绍里面有的一个非常重要的人物,今天将是他展现自己的能耐的时候到了,ContentResolver,那有人会说有了内容提供者大内总管在皇宫,什么数据不能拿到啊,还需要他干嘛,记住,大能总管是不能轻易离开皇帝的身边的,所以他只能暴露数据,暴露那里面的信息是个什么情况,他能分身去做这个吗(内容提供者是暴露数据,共享数据的),所以,一般情况下都是大内总管内容提供者把数据给暴露出来,比如书房什么时候空虚没有人啊,比如什么时候该去监听消息这样的事情就是ContentResolver,那说这哥们有什么能耐啊,这哥们的能耐就是把数据从内容提供者ContentProvide那接过来进行增删改查的,你要操作这些数据,必须要有这哥们,他也有四大杀手锏增删改查insert,delete,updatequery各位请看下面的

cr.insert(Uri.parse("content://com.qingdi.kangxi/qiju"), values);


cr.delete(Uri.parse("content://com.qingdi.kangxi"), "name=?",new String[]{ "康熙" });


cr.update(Uri.parse("content://com.qingdi.kangxi"), values,"name=?", new String[]{ "康熙" });


Cursor cursor = cr.query(
Uri.parse("content://com.qingdi.kangxi/dalieb/2"), new String[]
{ "name", "place" }, "name=?and place=?", new String[]
{ "康熙", "乾清宫" }, null);








也就是说啊,他也非等闲之辈啊,但是呢?这哥们也有自己的个性:我们前面让各位注意的那个非常重要的uri,我再给大家贴下这个代码吧

我们看到那个insert那个传入的参数其中有一个uri和values,values就不用说了,就是键值对,和我们那个集合Map在祖上貌似有点武学渊源,传值方式如出一辙,那这个uri是什么呢?uri,就是前面在内容提供者程序xml清单文件配置好的,我们姑且认为他就是一个简历吧,身份证:android:authorities="com.qingdi.kangxi"

这个东西(官方说法就是内容提供者的主机名),ContentResolver这个哥们呢,他做事很有个性,也很讲究原则性,他自己也定义了一条uri,好吧,你给我的uri和我自己定义的uri要匹配我才帮你办事,匹配哪项我帮你办哪项,要是都不匹配,对不起,你请回吧

他在自己的增删改查里面也定义了一条uri

大家要注意参数uri括号里面的写法:

cr.insert(Uri.parse("content://com.qingdi.kangxi/qiju"), values);

我们一般说着uri有没有单独是个字符串啊?没有吧,都是加前缀的,有点像一个域名,是不是,他这里也是有格式的(content://+主机名/表名),然后我们看到主机名后面/表名,这是因为有多张表的时候ContentResolver这哥们弄出来的方法,可以根据/表名来选择我插入的是哪张表,其实后面还可以加斜杠,在此不赘述:

另外在大内总管内容提供者那个类里面定义了一个匹配器,他和ContentResolver的定义规则是遥相呼应的:


这个匹配器定义的话最好还是定义在成员变量里面,因为他要先看到这个才决定要不要帮你啊,然后匹配器我这里是定义在静态代码块里面,静态代码块优先于对象产生,这点不必多说了,这里面三个参数分别是,一个uri,就是自定义的,第二个是表名,第三个是code值,人家就是根据这个返回的code值,当然这个code值是自己定义的,决定要不要接受帮你干事,看代码

比方说ContentResolver这哥们在三郎相会那边定义了:

cr.insert(Uri.parse("content://com.qingdi.kangxi/qiju"), values);他是不是选择了起居这张表啊,然而我们看下上面那张图,这张表的对应的那个code是不是1啊,然后再看下面这张图,if判断,是不是um.match(uri)==1的时候,就执行插入这条语句啊,所以他是绝对要匹配的,不然是不会办事的,这是个原则哥,我们就抛砖引玉,其他的增删改查和数据库没有什么差别,都是一样的操作,说白了就是在多张表的插入的时候,我们会根据uri的匹配来选择插入那张表。


如果这个值等于1,人家帮你在第一项(第qiju表里面)里面增删改查,如果等于2,帮你在guoshi这张表里面增删改查,如果一条都没有和他定义在匹配,对不起,太子殿下,我爱莫能助了,另请高明吧


说完这些,相信大家都对这个内容提供者有了深入的理解了吧,我们这个是自定义的内容提供者,之所以说这个,是因为,如果你连自定义的都弄懂了,那系统自带的还在话下吗,孩子,造反不是件容易的事情,还是踏实写代码吧,哈哈哈




1 0