java.lang.RuntimeException - Attempted to access a cursor after it has been closed

2014. 1. 13. 17:31Programing/Debugging

01-13 17:28:22.558: E/AndroidRuntime(31495): java.lang.RuntimeException: Unable to resume activity {com.victor.manageclique/com.victor.manageclique.MainActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed.


해당 이슈는 사용한 DB의 Cursor를 닫아 주지 않아서 발생하는 이슈입니다.

Cursor를 사용한 이후, cursor.close(); 를 해주시면 해결 됩니다.


해결책

   cursor.close();


이렇게 해도 동일한 문제가 발생하고 있다면, 
startManagingCursor(cursor)를 사용하고 있는지 확인해 보자.

Provider가 다른 Process에서 돌고 있는 경우에 remote access를 해야하기 때문에,
ContentProviderNative.ContentProviderProxy 를 통해서 query등을 진행하게 되고
그 결과 값을 Local process에서 사용할 수 있도록 BulkCursorToCursorAdaptor로 wrapping 후에 cursor값을 돌려준다.

여기까지는 전혀 문제가 없는데
Activity가 onResume될때 ManagingCursor의 경우 Activity의 life cycle에 따라서 자동으로 requery가 진행된다.
그런데 이때 Cursor가 이미 close된 경우에 문제가 발생한다.

최종 해결책
   1. startManagingCursor의 미사용
   2. 사용이 완료 된 Cursor는 반드시 Close