1

我在我的數據庫類中使用了rawQuery並將光標返回到我的適配器,該適配器是CursorAdapter,我將其與自定義的ListView項一起使用。如何在使用rawQuery和CursorAdapter時關閉我的光標

該視圖在屏幕上繪製或如何管理這個光標後,該遊標是否自動關閉?這種情況下的最佳做法是什麼?

如果我在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; 
    } 
+1

你可以發佈你的代碼 – KOTIOS

回答

4

您可以在設置新光標後關閉舊光標。 swapCursor()返回舊遊標,如果沒有遊標設置則返回null,如果您嘗試交換先前設置的遊標的同一實例,則返回null。知道了,你可以嘗試這樣的事:

Cursor oldCursor = yourAdapter.swapCursor(newCursor); 

if(oldCursor != null) 
    oldCursor.close(); 

注意,當你使用一個Loader(LoaderManager.LoaderCallbacks),該框架將關閉舊的光標。這就是documentation說:

onLoadFinished:

加載程序將發佈數據一旦它知道應用程序是沒有 不再使用它。例如,如果數據是來自CursorLoader的遊標,則不應該自己調用close()。 ...

+0

感謝您的好解釋。將嘗試LoaderManger .. –

2

Cursor不會被自動關閉。你需要關閉它。在較舊的API中,您可以通過致電Activity.startManagingCursor()Activity上註冊Cursor。在這種情況下,Activity負責管理它。在較新的API中,您應該更好地使用LoaderManager

+0

讓我試試LoadManager然後。 –