Android 生成查询 Making the query

你可以使用ContentResolver.query()方法或者Activity.managedQuery()方法来查询一个内容提供器。

两种方法使用相同的参数序列,而且都返回一个Cursor 对象。

不过,managedQuery()使得活动需要管理这个游标的生命周期。

一个被管理的游标处理所有的细节,比如当活动暂停时卸载自身,而活动重新启动时重新查询它自己。

你可以让一个活动开始管理一个尚未被管理的游标对象,通过如下调用:Activity.startManagingCursor()。无论query()还是managedQuery(),它们的第一个参数都是内容提供器的URI-CONTENT_URI 常量用来标识某个特定的ContentProvider 和数据集(参见前面的URIs)。

为了限制只对一个记录进行查询,你可以在URI 后面扩展这个记录的_ID 值-也就是,在URI 路径部分的最后加上匹配这个ID 的字符串。

比如,如果ID 是23,那么URI 会是:content://. . . ./23有一些辅助方法,特别是ContentUris.withAppendedId() 和Uri.withAppendedPath(),使得为URI 扩展一个ID 变得简单。

所以,比如,如果你想在联系人数据库中查找记录23,你可能需要构造如下的查询语句:import android.provider.Contacts.People; import android.content.ContentUris; import android.net.Uri; import android.database.Cursor; // Use the ContentUris method to produce the base URI for the contact with _ID == 23. Uri myPerson = ContentUris.withAppendedId(People.CONTENT_URI, 23); // Alternatively, use the Uri method to produce the base URI. // It takes a string rather than an integer. Uri myPerson = Uri.withAppendedPath(People.CONTENT_URI, "23"); // Then query for this specific record: Cursor cur = managedQuery(myPerson, null, null, null, null);query() 和managedQuery()方法的其它参数限定了更多的查询细节。

如下:
• 应该返回的数据列的名字。null 值返回所有列。否则只有列出名字的列被返回。所有这个平台的内容提供器为它们的列定义了常量。比如,android.provider.Contacts.Phones 类对前面说明过的通讯录中各个列的名字定义了常量ID, NUMBER, NUMBER_KEY, NAME, 等等。

• 指明返回行的过滤器,以一个SQL WHERE 语句格式化。null 值返回所有行。(除非这个URI 限定只查询一个单独的记录)。

• 选择参数

• 返回行的排列顺序,以一个SQL ORDER BY 语句格式化(不包含ORDER BY 本身)。null 值表示以该表格的默认顺序返回,有可能是无序的。

让我们看一个查询的例子吧,这个查询获取一个联系人名字和首选电话号码列表:import android.provider.Contacts.People; import android.database.Cursor; // Form an array specifying which columns to return. String[] projection = new String[] { People._ID, People._COUNT, People.NAME, People.NUMBER }; // Get the base URI for the People table in the Contacts content provider. Uri contacts = People.CONTENT_URI; // Make the query. Cursor managedCursor = managedQuery(contacts, projection, // Which columns to return null, // Which rows to return (all rows) null, // Selection arguments (none) // Put the results in ascending order by name People.NAME + " ASC");这个查询从联系人内容提供器中获取了数据。它得到名字,首选电话号码,以及每个联系人的唯一记录ID。

同时它在每个记录的_COUNT 字段告知返回的记录数目。

列名的常量被定义在不同的接口中-_ID 和_COUNT 定义在BaseColumns 里, NAME 在PeopleColumns 里,NUMBER 在PhoneColumns 里。Contacts.People 类已经实现了这些接口,这就是为什么上面的代码实例只需要使用类名就可以引用它们的原因。