managedQuery和query的区别
我们都知道在Android系统中,SQLite数据库的相关操作方式被封装为内容提供 Content Provider,可以帮助那些不会SQL语言的开发者快速实现Android平台上的数据库操作,但是平时我们在查询时一般返回的是Cursor对象,从本质上来看这两个API是不同的类提供的。Android123提示比如 ContentResolver.query(),以及 Activity.managedQuery()所以,我们看到一个是ContentResolver提供的查询方法,位于android.content.ContextWrapper.getContentResolver(),另一个则为Activity。
这两种方法的参数是一样的,但是Activity类的方法在整个生命周期中受Activity的影响,而常规我们处理数据逻辑可能单独分成一个类,直接使用Context对象传递实例句柄,同时Android开发网还建议大家,对于数据库查询操作如果数据较为庞大尽量使用异步的 AsyncQueryHandler方法防止阻塞线程。
Android API:Activity.managedQuery()
描述:
获取一个包含指定数据的 Cursor 对象,并由 Activity 来接管这个 Cursor 的生命周期。
首先该函数通过调用 getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder) 获取一个包含指定数据(由 query 方法的参数指定)的 Cursor 对象。
然后通过调用 startManagingCursor(c) 实现由 Activity 来接管返回的 Cursor c 的生命周期。
原型:
public final Cursor managedQuery(Uri uri,
String[] projection,
String selection,
String[] selectionArgs,
String sortOrder)
{
Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (c != null) {
startManagingCursor(c);
}
return c;
}
参数:
uri, 用于 Content Provider 查询的 URI,也就是说从这个 URI 中获取数据。例如:
Uri uri = Contacts.People.CONTENT_URI; //联系人列表URI。
projection, 用于标识 uri 中有哪些 columns 需要包含在返回的 Cursor 对象中。例如:
//待查询的columns
String[] projection = { Contacts.PeopleColumns.NAME, Contacts.PeopleColumns.NOTES };
selection, 作为查询的过滤参数(过滤出符合 selection 的数据),类似于 SQL 中 Where 语句之后的条件选择。例如:
String selection = Contacts.People.NAME + “=?” //查询条件
selectionArgs, 查询条件参数,配合 selection 参数使用。例如:
String[] selectionArgs = {“Braincol”, “Nixn.dev”};//查询条件参数
sortOrder,查询结果的排序方式(按查询列( projection 参数中的 columns )中的某个 column )排序)。例如:
String sortOrder = Contacts.PeopleColumns.NAME; //查询结果的排序方式(按指定的查询列排序)
返回值:
一个包含指定数据的 Cursor 对象。
示例:
Uri uri = Contacts.People.CONTENT_URI;
String[] projection = { Contacts.PeopleColumns.NAME,
Contacts.PeopleColumns.NOTES };
String selection = Contacts.PeopleColumns.NAME + "=?";
String[] selectionArgs = { "Braincol","Nixn.dev" };
String sortOrder = Contacts.PeopleColumns.NAME;
//使用 managedQuery 获取 Contacts.People 这个 ContentProvider 的 Cursor。
Cursor cursor = managedQuery(uri, projection, selection, selectionArgs,sortOrder);
上述示例的含义就是:在联系人列表中查询 NAME 为 Braincol 和 Nixn.dev 两个联系人的 "NAME" 和 "NOTES" 信息,并且将这些信息按照名字( NAME )排序,最后将排序之后的结果包装在一个 Cursor 对象中返回。