初识ContentProvider
在第6章当中,介绍了组成Android程序的主要4部分,它们分别是。
Activity。
Broadcast Intent Receiver。
Service。
Content Provider。
关于Actvity和相关View的部分,已经在前边章节进行了比较详细的介绍,在这一节中,将学习Android应用里另外一个非常重要的部分ContentProvider。
1.什么是ContentProvider
Android这个系统和其他的操作系统还不太一样,读者需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。那这个时候有读者就会提出问题,难道两个程序之间就没有办法对于数据进行交换?Android这么优秀的系统不会让这种情况发生的。解决这个问题主要靠ContentProvider。一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。也就是说,一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,当然,中间也会涉及一些权限的问题。下边列举一些较常见的接口,这些接口如下所示。
query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor。
insert(Uri url, ContentValues values):将一组数据插入到Uri 指定的地方。
update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据。
delete(Uri url, String where, String[] selectionArgs):删除指定Uri并且符合一定条件的数据。
2.什么是ContentResolver
外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的ContentResolver实例。ContentResolver提供的接口和ContentProvider中需要实现的接口对应,主要有以下几个。
query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor。
insert(Uri url, ContentValues values):将一组数据插入到Uri 指定的地方。
update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据。
delete(Uri url, String where, String[] selectionArgs):删除指定Uri并且符合一定条件的数据。
3.ContentProvider和ContentResolver中用到的Uri
在ContentProvider和ContentResolver当中用到了Uri的形式通常有两种,一种是指定全部数据,另一种是指定某个ID的数据。我们看下面的例子。
content://contacts/people/? 这个Uri指定的就是全部的联系人数据。
content://contacts/people/1 这个Uri指定的是ID为1的联系人的数据。
在上边两个类中用到的Uri一般由3部分组成。
第一部分是:"content://" 。
第二部分是要获得数据的一个字符串片段。
最后就是ID(如果没有指定ID,那么表示返回全部)。
由于URI通常比较长,而且有时候容易出错,且难以理解。所以,在Android当中定义了一些辅助类,并且定义了一些常量来代替这些长字符串的使用,例如下边的代码:
Contacts.People.CONTENT_URI (联系人的URI)。
?使用ContentProvider读取系统数据(1)
在这个例子里边,首先在系统的联系人应用当中插入一些联系人信息,然后把这些联系人的名字和电话再显示出来,通过这个例子可以学到。
如何在联系人应用当中添加联系人。
如何使用系统提供的ContentProvider。
如何使用ContentResolver当中的query()方法。
具体实现步骤如下所示。
1.第一步
在Eclipse中打开ex09_1_ContentProvider项目,具体操作如下。
(1)新建一个项目,依次单击File→New→Android Project项。
(2)在新建项目的对话框中,选择Create project from existing source项。
(3)单击浏览按钮,找到ex09_1_ContentProvider项目,然后单击确定按钮。
程序的目录结构如图8-23所示。
2.第二步
首先运行这个项目,将会看到如图8-24所示的界面。
? |
(点击查看大图)图8-23? 程序的目录结构 |
? |
(点击查看大图)图8-24? 未添加任何数据的主界面 |
图8-24所示的列表中没有任何数据,接下来的操作是为应用添加几条联系人数据。
3.第三步
按照下列图示添加几条数据到联系人列表中,具体步骤如下。
(1)单击模拟器的Home键,在转出来的界面上,单击桌面上的Contacts应用,如图8-25所示。
(2)进入应用后,单击MENU项,在出现的界面上单击New contact 按钮,如图8-26所示。
使用ContentProvider读取系统数据(2)
(3)添加联系人姓名和电话号码信息,如图8-27所示。
(4)单击MENU项,在返回的界面上单击Save项保存,如图8-28所示。
? |
(点击查看大图)图8-27? 添加联系人姓名和电话号码 |
? |
(点击查看大图)图8-28? 保存联系人姓名和电话号码信息 |
(5)按照上边的操作步骤,添加了两条数据后显示如图8-29所示。
4.第四步
再次运行程序,模拟器显示如图8-30所示。
? |
(点击查看大图)图8-29? 添加后结果 |
? |
(点击查看大图)图8-30? 模拟器显示 |
- protected?void?onCreate(Bundle?savedInstanceState)?{ ?
- ???????super.onCreate(savedInstanceState); ?
- ???????Cursor?c?=?getContentResolver().query(Phones.CONTENT_URI,?null,?null,?null,?null); ?
- ???????startManagingCursor(c); ?
- ???????ListAdapter?adapter?=?new?SimpleCursorAdapter(this, ?
- ???????????????Android.R.layout.simple_list_item_2,?c, ?
- ???????????????????????new?String[]?{?Phones.NAME,?Phones.NUMBER?}, ?
- ???????????????????????new?int[]?{?Android.R.id.text1,Android.R.id.text2?}); ?
- ???????setListAdapter(adapter); ?
- }?
代码解释:
getContentResolver()方法得到应用的ContentResolver实例。
query(Phones.CONTENT_URI, null, null, null, null)。它是ContentResolver里的方法,负责查询所有联系人,并返回一个Cursor。这个方法参数比较多,每个参数的具体含义如下。
第一个参数为Uri,在这个例子里边这个Uri是联系人的Uri。
第二个参数是一个字符串的数组,数组里边的每一个字符串都是数据表中某一列的名字,它指定返回数据表中那些列的值。
第三个参数相当于SQL语句的where部分,描述哪些值是我们需要的。
第四个参数是一个字符串数组,它里边的值依次代替在第三个参数中出现的"?"符号。
第五个参数指定了排序的方式。
startManagingCursor(c)语句让系统来管理生成的Cursor。
ListAdapter adapter = new SimpleCursorAdapter(this,Android.R.layout.simple_list_item_2, c, new String[] { Phones.NAME, Phones.NUMBER }, new int[] { Android.R.id.text1, Android.R.id.text2 })语句生成一个SimpleCursorAdapter。(关于SimpleCursorAdapter我们在第7章已经详细介绍过了。)
setListAdapter(adapter)。将ListView和SimpleCursorAdapter进行绑定。
?
? |
(点击查看大图)图8-25? 单击Contacts应用 |
? |
(点击查看大图)图8-26? 单击New contact选项 |