Android 使用rawQuery和CursorAdapter时如何关闭光标
我在DB类中使用Android 使用rawQuery和CursorAdapter时如何关闭光标,android,android-listview,android-custom-view,android-cursor,Android,Android Listview,Android Custom View,Android Cursor,我在DB类中使用rawQuery,并将光标返回到适配器,适配器是一个CursorAdapter,我与自定义ListView项一起使用 在屏幕中绘制视图后,该光标是否自动关闭,或者如何管理该光标?这种情况下的最佳实践是什么 如果在DB类中关闭此游标,则无法从适配器访问它们 谢谢你花时间和精力帮助我 编辑以添加一些代码片段以更好地理解 这是我的活动代码: calAdapter = new CalendarListAdapter(context, dbHelper.getAllCalendars())
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;
}
光标
不会自动关闭。你需要关闭它。在旧的API中,您可以通过调用Activity.startManagingCursor()
在Activity
处注册Cursor
。在这种情况下,活动负责管理它。在较新的API中,您最好使用。光标不会自动关闭。你需要关闭它。在旧的API中,您可以通过调用Activity.startManagingCursor()
在Activity
处注册Cursor
。在这种情况下,活动负责管理它。在较新的API中,最好使用。设置新光标后,可以关闭旧光标swapCursor()
返回旧游标,如果未设置游标,则返回null
,如果尝试交换先前设置的游标的相同实例,则还返回null
。知道了这一点,您可以尝试以下方式:
Cursor oldCursor = yourAdapter.swapCursor(newCursor);
if(oldCursor != null)
oldCursor.close();
请注意,当您使用加载程序(LoaderManager.LoaderCallbacks)时,框架将关闭旧游标。这是政府所说的:
装载完成:
加载程序一旦知道应用程序不可用,就会释放数据
不再使用它。例如,如果数据是来自
CursorLoader,您不应该自己对其调用close()
设置新光标后,可以关闭旧光标swapCursor()
返回旧游标,如果未设置游标,则返回null
,如果尝试交换先前设置的游标的相同实例,则还返回null
。知道了这一点,您可以尝试以下方式:
Cursor oldCursor = yourAdapter.swapCursor(newCursor);
if(oldCursor != null)
oldCursor.close();
请注意,当您使用加载程序(LoaderManager.LoaderCallbacks)时,框架将关闭旧游标。这是政府所说的:
装载完成:
加载程序一旦知道应用程序不可用,就会释放数据
不再使用它。例如,如果数据是来自
CursorLoader,您不应该自己对其调用close()
那么让我试试LoadManager。那么让我试试LoadManager。