본문 바로가기

안드로이드 개발 팁/데이터베이스

SimpleCursorAdapter 사용시 column '_id' does not exist 에러가 뜨면?

데이터베이스에 담긴 정보를 리스트(ListView)에 표시할 때 주로 SimpleCursorAdapter를 많이 사용합니다.
간단하면서 사용하기도 간편하기 때문이죠. ㅎㅎ

그런데 이렇게 SimpleCursorAdapter를 사용할 때, 주의해야 할 것이 한가지 있습니다.
바로 SimpleCursorAdapter로 넘겨주는 Cursor 객체, 즉 쿼리(Query) 결과에 각 행의 id를 나태내는 열인 '_id'가 포함되어 있어야 한다는 것이죠.

SimpleCursorAdapter는 CursorAdapter를 상속하는데, CursorAdapter 클래스 자체가 이 열을 필수로 필요로 하므로, 당연 SimpleCursorAdapter도 필수로 필요한 것입니다.

실제 CursorAdapter의 Documentation에는 아래와 같이 써있습니다.


The Cursor must include a column named "_id" or this class will not work.



쿼리 결과에 _id 열을 포함시키지 않았다면, LogCat 에 아래와 같이 에러 메시지가 표시될 것입니다.


08-07 03:46:58.944: ERROR/AndroidRuntime(846): Uncaught handler: thread main exiting due to uncaught exception
08-07 03:46:58.962: ERROR/AndroidRuntime(846): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhuman.project.HistoryView/com.androidhuman.project.HistoryView.HistoryView}: java.lang.IllegalArgumentException: column '_id' does not exist
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.os.Looper.loop(Looper.java:123)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.app.ActivityThread.main(ActivityThread.java:3948)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at java.lang.reflect.Method.invokeNative(Native Method)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at java.lang.reflect.Method.invoke(Method.java:521)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at dalvik.system.NativeStart.main(Native Method)
08-07 03:46:58.962: ERROR/AndroidRuntime(846): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.widget.CursorAdapter.init(CursorAdapter.java:111)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.widget.CursorAdapter.<init>(CursorAdapter.java:90)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:47)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:85)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at com.androidhuman.project.HistoryView.HistoryView.refreshList(HistoryView.java:23)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at com.androidhuman.project.HistoryView.HistoryView.onCreate(HistoryView.java:35)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
08-07 03:46:58.962: ERROR/AndroidRuntime(846):     ... 11 more