今天说一下以下两种方式query数据:
Cursor c1 = mContext.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
Cursor c2 = mActivity.managedQuery(uri, projection, selection, sortOrder);
使用方法一:若将Cursor c1数据放入Adapter 中,如getView() 调用加载数据,需在此Adapter对应Activity生命周期中,对Cursor进行控制,尤其要注意c1.close()的处理,否则会在反复出现如下Exception.
E/Cursor ( 1384): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/xx/databases/xx.db, table = xx, query = SELECT xx
E/Cursor ( 1384): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
E/Cursor ( 1384): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
E/Cursor ( 1384): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
E/Cursor ( 1384): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
E/Cursor ( 1384): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
E/Cursor ( 1384): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
E/Cursor ( 1384): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1301)
使用方法二:Cursor c2 会随着Activity生命周期的变化,让Activity去控制c2的生命周期,所以不用太但心cursor是否被close,是否requery.
原文引用:
Making the query
To query a content provider, you can use either the
method or the ContentResolver.query()
method. Both methods take the same set of arguments, and both return a Cursor object. However, Activity.managedQuery()
managedQuery()
causes the activity to manage the life cycle of the Cursor. A managed Cursor handles all of the niceties, such as unloading itself when the activity pauses, and requerying itself when the activity restarts. You can ask an Activity to begin managing an unmanaged Cursor object for you by calling
.Activity.startManagingCursor()