使用rawQuery和CursorAdapter时如何关闭我的Cursor

时间:2014-06-14 17:25:56

标签: android android-listview android-custom-view android-cursor

我在我的数据库类中使用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;
    }

2 个答案:

答案 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中,您可以通过调用CursorActivity注册Activity.startManagingCursor()。在这种情况下,Activity负责管理它。在较新的API中,您最好使用LoaderManager