android之内容提供者解析

感谢chenzheng提供的文章讲解,此文转载http://blog.csdn.net/chenzheng_java/archive/2011/03/08/6232632.aspx

该系统有两个应用,比较繁琐。但是内容提供者是android里非常非常重要的一个内容,我们得好好学习下哦。先看效果图,我们提供了四个按钮,点击按钮便会进行相应的操作。

 

想说的话,在代码的注释中已经说的很清晰了。这里再次重复下我们定义和使用内容提供者的步骤吧。

定义内容提供者:

我们定义内容提供者的目的是什么,共享数据,对,定义内容提供者的目的就是让别的应用能够访问当前应用的一些数据,至于到底暴露给外界什么数据,我们可以在定义内容提供者的时候详细控制!不管如何,我们明确了第一个问题,定义内容提供者的目的----数据共享!

我们平时对数据的操作都有哪些?增删改查!就四个字!这也是为什么我们再定义内容提供者的时候必须要实现相应的方法了。当然如果你要是不想提供相应的操作,你可以在内部进行方法空实现。

是不是所有的应用都可以访问我啊?不可能!我们可不是随便的人,对吧!所以我们要进行验证,验证不通过的直接让它去死就可以了。验证怎么验证啊?通过UriMatcher进行匹配!

现在我们已经提供了访问接口了,我们怎么让系统知道,别的应用可以用我的东西啊?去配置文件中注册!!

使用内容提供者:

如何找到该内容提供者啊?需要Uri和相应的访问权限。相当于地址

如何进行增删查改啊?通过ContentResolver对象的相应方法。

 

SQLiteDatabase的几个重要方法的参数列表

public long insert (String table, String nullColumnHack, ContentValues values)
table:表名;
nullColumnHack:设置为null;
valuse:你要插入的值,类型为ContentValues。

public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
table:表名;
values:你需要更新个数据组成的一个map,由列的名字和列的新值构成,null是合法的值,会被转化为NULL;
whereClause:更新的条件,为一个字符串。如果为null,则所有行都将更新;
whereArgs:字符串数组,和whereClause配合使用。有两种用法,如果whereClause的条件已经直接给出,如“class = “ + num,num是传入的参数,则whereArgs可设为null。如果是”class = ?“,则?会被whereArgs这个数组中对应的值替换,whereArgs给出?代表的值,有多个?的,字符串数组里的值依次填入。

public int delete (String table, String whereClause, String[] whereArgs)
table:表名;
whereClause:删除的条件,用法和update里的一样。如果为null,则删除全部行。
whereArgs:用法和update里的一样。

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
table:表名;
culumns:需要返回的列的列表,如果为null,则返回全部的列;
selection:查询的条件,符合什么条件的行将返回。如果为null,则这个表里的所有行都将返回。其两种用法和update里的一样;
selectionArgs:用法和update里的一样。

注:
1.selection中的条件,不是用“,”分隔的,而是用“and”等逻辑关系词分隔的。
2.Cursor一点要记得close();

 

两个工程见附件:(回头在研究)

注意:

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,必须两个工程同时进行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值