今天说一下以下两种方式query数据:
- Cursorc1=mContext.getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);
- Cursorc2=mActivity.managedQuery(uri,projection,selection,sortOrder);
使用方法一:若将Cursor c1数据放入Adapter 中,如getView() 调用加载数据,需在此Adapter对应Activity生命周期中,对Cursor进行控制,尤其要注意c1.close()的处理,否则会在反复出现如下Exception.
- E/Cursor(1384):FinalizingaCursorthathasnotbeendeactivatedorclosed.database=/data/data/xx/databases/xx.db,table=xx,query=SELECTxx
- E/Cursor(1384):android.database.sqlite.DatabaseObjectNotClosedException:Applicationdidnotclosethecursorordatabaseobjectthatwasopenedhere
- E/Cursor(1384):atandroid.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
- E/Cursor(1384):atandroid.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
- E/Cursor(1384):atandroid.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
- E/Cursor(1384):atandroid.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
- E/Cursor(1384):atandroid.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
- E/Cursor(1384):atandroid.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1301)
使用方法二:Cursor c2 会随着Activity生命周期的变化,让Activity去控制c2的生命周期,所以不用太但心cursor是否被close,是否requery.
参考:http://consuela-zhao.iteye.com/blog/961617