3.0 이후 버전에서 CursorAdapter에 커서 두개이상을 조합한 MergeCursor 사용시 버그가 있습니다.


처음 데이터 표시는 잘되지만 데이터 변경이 일어나 커서가 갱신될 때 CursorIndexOfBoundsException 이 일어납니다.


ICS가 올려진 폰을 쓰시는분들중에 가끔 어떤 앱에서 데이터를 추가하거나 수정하면 갑자기 오류메세지가 뜨면서


꺼지는 경우를 보셨을 겁니다. 다 CursorAdapter에 MergeCursor를 사용한 어플들 입니다.


에러로그를 보고 제가 추측해보건데 데이터가 갱신되면 소속된 Cursor 모두의 requery()가 일어난 이후에


즉 MergeCursor에 속한 Cursor들이 모두 완성되고 나서 Adapter가 갱신 되야 하는데 그렇지 않고 첫번째 커서가


완성되고 다른커서들을 받아오는 과정에서 갱신하려다보니 컬럼을 찾지 못해 생기는 버그인듯 합니다.



이것을 해결할 수 있는 방법으로 몇가지가 있겠는데 CursorAdapter의 getItemId()메서드를 오버라이딩해서


CursorIndexOfBoundsException를 try catch에서 잡아서 무시해버리는 방법이 있고


그러나 이경우는 혹시나도 일어날 수 있는 CursorIndexOfBoundsException에 대한 예외를 모두 이것으로 간주해


버린다는 위험요소가 존재합니다.



또하나는 MergeCursor를 쓰지 않고 쿼리를 날릴 때 Cursor를 두개 이상 받아서 합치는 대신 UNION을 이용하는 방법이


있습니다. 이경우는 MatrixCursor 같은 커서나 혹은 Cursor를 상속받아 재정의한 커서들에 대한 활용을 할 수 없다는 단점이


존재합니다.