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


package shy.luo.providers.articles;import android.net.Uri;public class Articles {/*Data Field*/public static final String ID = "_id";public static final String TITLE = "_title";public static final String ABSTRACT = "_abstract";public static final String URL = "_url";/*Default sort order*/public static final String DEFAULT_SORT_ORDER = "_id asc";/*Call Method*/public static final String METHOD_GET_ITEM_COUNT = "METHOD_GET_ITEM_COUNT";public static final String KEY_ITEM_COUNT = "KEY_ITEM_COUNT";/*Authority*/public static final String AUTHORITY = "shy.luo.providers.articles";/*Match Code*/public static final int ITEM = 1;public static final int ITEM_ID = 2;public static final int ITEM_POS = 3;/*MIME*/public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.shy.luo.article";public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.shy.luo.article";/*Content URI*/public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/item");public static final Uri CONTENT_POS_URI = Uri.parse("content://" + AUTHORITY + "/pos");}
ID、TITLE、和URL四个常量前面已经解释过了,它是我们用来保存文章信息的数据表的四个列名;常量是调用接口的query函数来查询数据时用的,它表示对查询结果按照_id列的值从小到大排列;T和两个常量是调用接口的一个未公开函数call来查询数据时用的,它类似于微软COM中的接口的函数,使用这个call函数时,传入参数T表示我们要调用我们自定义的子类中的函数来获取数据库中的文章信息条目的数量,结果放在一个中以为关键字的域中 。
剩下的常量都是跟数据URI相关的,这个需要详细解释一下 。URI的全称是,即通用资源标志符,通过它用来唯一标志某个资源在网络中的位置,它的结构和我们常见的HTTP形式URL是一样的,其实我们可以把常见的HTTP形式的URL看成是URI结构的一个实例,URI是在更高一个层次上的抽象 。在系统中,它也定义了自己的用来定痊某个特定的 的URI结构,它通常由四个组件来组成,如下所示:
[://][shy.luo..][/item][/123]
|------A------|-----------------B-------------------|---C---|---D--|
A组件称为,它固定为://,表示它后面的路径所表示的资源是由 来提供的 。
B组件称为,它唯一地标识了一个特定的,因此,这部分内容一般使用 所在的来命名,使得它是唯一的 。
C组件称为资源路径,它表示所请求的资源的类型,这部分内容是可选的 。如果我们自己所实现的 只提供一种类型的资源访问,那么这部分内部就可以忽略;如果我们自己实现的 同时提供了多种类型的资源访问,那么这部分内容就不可以忽略了 。例如,我们有两种电脑资源可以提供给用户访问,一种是笔记本电脑,一种是平板电脑,我们就把分别它们定义为和pad;如果我们想进一步按照系统类型来进一步细分这两种电脑资源,对笔记本电脑来说,一种是安装了系统的,一种是安装了linux系统的,我们就分别把它们定义为/和/linux;对平板电脑来说,一种是安装了ios系统的,一种是安装了系统的,我们就分别把它们定义为pad/ios和pad/ 。
D组件称为资源ID,它表示所请求的是一个特定的资源,它通常是一个数字,对应前面我们所介绍的数据库表中的_id字段的内容,它唯一地标志了某一种资源下的一个特定的实例 。继续以前面的电脑资源为例,如果我们请求的是编号为123的装了系统的平板电脑,我们就把它定义为pad//123 。当忽略这部分内容时,它有可能是表示请求某一种资源下的所有实例,取决于我们的URI匹配规则,后面我们将会进一步解释如何设置URI匹配规则 。
回到上面的.java源文件中,我们定义了两个URI,分别用和两个常量来表示,它们的组件均指定为shy.luo.. 。其中,常量表示的URI表示是通过ID来访问文章信息的,而常量表示的URI表示是通过位置来访问文章信息的 。例如,://shy.luo../item表示访问所有的文章信息条目;://shy.luo../item/123表示只访问ID值为123的文章信息条目;://shy.luo../pos/1表示访问数据库表中的第1条文章信息条目,这条文章信息条目的ID值不一定为1 。通过常量来访问文章信息条目时,必须要指定位置,这也是我们设置的URI匹配规则来指定的,后面我们将会看到 。