今天說一下以下兩種方式query資料:
Java代碼
- 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.
Java代碼
- 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.
參考:http://consuela-zhao.iteye.com/blog/961617