Как сделать так, чтобы мой курсор пережил изменение ориентации?

Я пытаюсь сделать мое приложение удобным для вращения, но у меня возникают некоторые проблемы с сохранением курсора.

Курсор содержит около 13 тысяч + строк данных, отображаемых в ListView , и, таким образом, потребовалось бы довольно много времени, если бы я выполнял запрос каждый раз при изменении конфигурации. В моем onRetainNonConfigurationInstance () я возвращаю свой Cursor, а затем получаю его через getLastNonConfigurationInstance () .

Однако мой извлеченный курсор, похоже, уже закрыт, и поэтому мой адаптер больше не может отображать список. Насколько я понимаю, курсор был закрыт, поскольку onDestroy () автоматически закрывает все курсоры.

Я сохраняю Курсор следующим образом:

@Override
public Object onRetainNonConfigurationInstance() {
    return myCursor;
}

И получаю его следующим образом:

myCursor = (Cursor)getLastNonConfigurationInstance();
if (myCursor == null) {
    // Do some stuff here (access DB, etc)
} else { // we are returning from configuration change
    // Feed the cursor to the adapter
}

Я вставляю трассировку стека, если кто-то хочет ее просмотреть:

01-25 16:57:45.637: ERROR/AndroidRuntime(12976): android.database.StaleDataException: Access closed cursor
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at com.test.sample.helper.DictionaryAdapter.bindView(DictionaryAdapter.java:35)
[........More ListView-related errors here..........]

Я прошел через код и обнаружил, что как что касается onRetainNonConfigurationInstance () , курсор все еще открыт, но после получения его через getLastNonConfigurationInstance () он уже закрыт.

Как сделать так, чтобы мой Курсор пережил изменение ориентации? Спасибо вам за помощь!

РЕДАКТИРОВАТЬ: На основании ответа Ромена я закомментировал все мои startManagingCursor () s.Я должен был соединить точки и подумать об этом! В любом случае, мое приложение теперь выдерживает один поворот, но возвращение его в исходную ориентацию все равно приводит к сбою. Продолжаю отладку и дам вам знать, что я узнал.

EDIT2: Думаю, я нашел причину новых ошибок. Я реализовал FilterQueryProvider , который возвращает новый курсор. Что я сделал, так это присвоил результаты этого фильтра моему исходному курсору. Кажется, пока работает.

9
задан Zarah 26 January 2011 в 02:39
поделиться