Android 使用rawQuery和CursorAdapter时如何关闭光标

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())

我在DB类中使用
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。