Android应用程序组件Content Provider应用实例( 五 )


第二点是设置URI匹配规则 。因为我们是根据URI来操作数据库的,不同的URI对应不同的操作,所以我们首先要定义好URI匹配规则,这样,当我们获得一个URI时,就能快速地判断出要如何去操作数据库 。设置URI匹配规则的代码如下所示:
private static final UriMatcher uriMatcher;static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(Articles.AUTHORITY, "item", Articles.ITEM);uriMatcher.addURI(Articles.AUTHORITY, "item/#", Articles.ITEM_ID);uriMatcher.addURI(Articles.AUTHORITY, "pos/#", Articles.ITEM_POS);}
在创建对象时,我们传给构造函数的参数为.,它表示当不能匹配指定的URI时,就返回代码. 。接下来增加了三个匹配规则,分别是://shy.luo../item、://shy.luo../item/#和://shy.luo../pos/#,它们的匹配码分别是.ITEM、.和.,其中,符号#表示匹配任何数字 。
第三点是的使用 。在query函数中,我们使用来辅助数据库查询操作,使用这个类的好处是我们可以不把数据库表的字段暴露出来,而是提供别名给第三方应用程序使用,这样就可以把数据库表内部设计隐藏起来,方便后续扩展和维护 。列别名到真实列名的映射是由下面这个成员变量来实现的:
private static final HashMap articleProjectionMap;static {articleProjectionMap = new HashMap();articleProjectionMap.put(Articles.ID, Articles.ID);articleProjectionMap.put(Articles.TITLE, Articles.TITLE);articleProjectionMap.put(Articles.ABSTRACT, Articles.ABSTRACT);articleProjectionMap.put(Articles.URL, Articles.URL);}
在上面的put函数中,第一个参数表示列的别名,第二个参数表示列的真实名称 。在这个例子中,我们把列的别名和和真实名称都设置成一样的 。
第四点是数据更新机制的使用 。执行、和三个函数时,都会导致数据库中的数据发生变化,所以这时候要通过调用接口的函数来通知那些注册了监控特定URI的对象,使得它们可以相应地执行一些处理,例如更新数据在界面上的显示 。在query函数中,最终返回给调用者的是一个,调用者获得这个以后,可以通过它的或者来执行一些更新数据库的操作,这时候也要通知那些注册了相应的URI的来作相应的处理,因此,这里在返回之前,要通过类的函数来把当前上下文的对象保存到里面去,以便当通过这个来改变数据库中的数据时,可以通知相应的来处理 。不过这种用法已经过时了,即不建议通过这个来改变数据库的数据,要把中的数据看作是只读数据 。这里调用类的函数还有另外一个作用,我们注意到它的第二个参数uri,对应的是中的内容,当把这个uri传给时,就会注册自己的来监控这个uri对应的数据的变化 。一旦这个uri对应的数据发生变化,这个对应的数据就不是再新的了,这时候就需要采取一些操作来更新内容了 。
第五点我们实现了的call函数 。这个函数是一个未公开的函数,第三方应用程序只有源代码环境下开发,才能使用这个函数 。设计这个函数的目的是什么呢?我们知道,当我们需要从 中获得数据时,一般都是要通过调用它的query函数来获得的,而这个函数将数据放在中来返回给调用者 。以前面一篇文章应用程序组件 简要介绍和学习计划中,我们提到,传给第三方应用程序的数据,是通过匿名共享内存来传输的 。当要传输的数据量大的时候,使用匿名共享内存来传输数据是有好处的,它可以减入数据的拷贝,提高传输效率 。但是,当要传输的数据量小时,使用匿名共享内存来作为媒介就有点用牛刀来杀鸡的味道了,因为匿名共享内存并不是免费的午餐,系统创建和匿名共享内存也是有开销的 。因此,提供了call函数来让第三方应用程序来获取一些自定义数据,这些数据一般都比较小,例如,只是传输一个整数,这样就可以用较小的代价来达到相同的数据传输的目的 。