我在我的数据库类中使用rawQuery
并将光标返回到我的适配器,该适配器是CursorAdapter
,我使用自定义ListView
项。
在屏幕上绘制视图或如何管理此光标后,此光标是否自动关闭?这种情况下的最佳做法是什么?
如果我在DB类中关闭此光标,我将无法从我的适配器访问它们。
感谢您花时间和精力帮助我。
编辑以添加一些代码段以便更好地理解
这是我的活动代码:
calAdapter = new CalendarListAdapter(context, dbHelper.getAllCalendars());
drawerList.setAdapter(calAdapter);
这是我的光标
public Cursor getAllCalendars() {
String query = "SELECT calendarId as _id, calendarName, calState, calShow FROM "
+ TABLE_CALENDAR_LIST;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query, null);
return cursor;
}
答案 0 :(得分:4)
您可以在设置新光标后关闭旧光标。 swapCursor()
返回旧的Cursor,如果没有设置游标,则返回null
,如果尝试交换先前设置的游标的相同实例,则返回null
。知道了,你可以尝试这样的事情:
Cursor oldCursor = yourAdapter.swapCursor(newCursor);
if(oldCursor != null)
oldCursor.close();
请注意,当您使用Loader(LoaderManager.LoaderCallbacks)时,框架将关闭旧游标。这就是documentation所说的:
onLoadFinished:
一旦知道应用程序为no,加载程序就会释放数据 更长时间使用它。例如,如果数据是来自a的光标 CursorLoader,你不应该自己调用close()。 ...
答案 1 :(得分:2)
Cursor
不会自动关闭。你需要关闭它。在较旧的API中,您可以通过调用Cursor
在Activity
注册Activity.startManagingCursor()
。在这种情况下,Activity负责管理它。在较新的API中,您最好使用LoaderManager
。