이 게시물을 무단으로 사용하는 행위(비영리, 영리 포함)는 CCL 2.0 저작자 표시-비영리-변경금지 라이센스에 의거하여 금지되어 있습니다. 원본 글의 출처 및 저작자를 표시해 주신다면 글의 스크랩은 자유롭게 하실 수 있습니다. 단, 비영리 목적의 발표(스터디 등)에 위 글을 사용하고 싶으신 분은 제게 미리 메일로 문의 부탁드립니다.
저작권과 관련된 자세한 사항은 이곳을 참조해 주시기 바랍니다.
저작권과 관련된 자세한 사항은 이곳을 참조해 주시기 바랍니다.
데이터베이스에 담긴 정보를 리스트(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
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
'안드로이드 개발 팁 > 데이터베이스' 카테고리의 다른 글
| 데이터베이스, 그 속이 궁금하다? (10) | 2010/02/15 |
|---|---|
| SimpleCursorAdapter 사용시 column '_id' does not exist 에러가 뜨면? (17) | 2009/09/20 |
안드로이드 정보, 강좌를 누구보다 빨리 접하고 싶으신가요?
그렇다면 이메일 구독 혹은
를 통해 업데이트되는 최신 글들을 받아보실 수 있습니다. :)





댓글을 달아 주세요
저도 떠서 고생했는데 완전 고맙습니다. ㅠ_ㅠ
2009/12/24 16:22 [ ADDR : EDIT/ DEL : REPLY ]이거때문에 한 몇일은 고생한것같아요 ㅠㅠ
2009/12/24 17:07 [ ADDR : EDIT/ DEL ]아, 감사합니다~ 예전에도 잘 봤었는데 검색했더니 또 커니님 블로그 나와서 해결하네요 ^^
2010/10/05 12:58 [ ADDR : EDIT/ DEL : REPLY ]그렇다면 모든 도서관, 비디오방 관리 같은 복잡한 DB 쿼리 결과 SimpleCursorAdapter 사용해서 프로그램 하려면 모든 컬럼에 _id 필드가 붙어야한단말인가요???
2011/02/19 16:20 [ ADDR : EDIT/ DEL : REPLY ]모든 컬럼이 아니라 해당 테이블에 _id 필드가 있어야 한다는 뜻입니다. 사실, SimpleCUrsorAdapter 뿐만 아니라 자신이 직접 커서 어댑터를 상속받아 별도의 어댑터를 만들 때도 _id 필드가 있는 것이 훨씬 편리합니다.
2011/02/21 13:28 [ ADDR : EDIT/ DEL ]아~~ 이것 때문에 고생했는데 여기 정답이 있군요. 좋은 정보 감사합니다.^^
2011/06/14 13:52 [ ADDR : EDIT/ DEL : REPLY ]좋은 정보 감사합니다~
2011/08/01 19:03 [ ADDR : EDIT/ DEL : REPLY ]근데.. 위에 이미지를 보면 _id를 출력하지는 않으신 것 같은데
어떻게 하면 출력하지 않을 수가 있을까요?
출력할 필요는 없는데...
이리저리 해봐도 _id가 사라지니 자꾸 에러가 나네요~
제가 완전 초짜라서리...ㅋㅋ
SimpleCursorAdapter를 사용하려면 id 필드가 꼭 필요합니다. 사용하지 않는 방법은 없습니다 ^^;
2011/08/02 00:34 [ ADDR : EDIT/ DEL ]커서어댑터의 api내용을 살펴보면 다음과 같은 설명이 적혀있습니다 :
2011/08/02 00:35 [ ADDR : EDIT/ DEL ]The Cursor must include a column named "_id" or this class will not work.
네~감사합니다. 블로그 내용 보고 알게되었습니다.
2011/08/02 10:00 [ ADDR : EDIT/ DEL : REPLY ]그런데, 위에 스크린샷을 보니
_id를 출력하지는 않으신 것 같아서 물어본 겁니다.
출력하지 않는 방법은 없을까요?
SimpleCursorAdapter에서 from, to 바인딩 해주실때 안해주시면 됩니다 ㅎㅎㅎ
2011/08/03 00:38 [ ADDR : EDIT/ DEL ]그러게요~출력 안 하면 되네요~ㅋ 감사합니다.
2011/08/03 13:08 [ ADDR : EDIT/ DEL : REPLY ]좀 다른 질문이긴 한데...ㅋ
2011/08/08 00:00 [ ADDR : EDIT/ DEL : REPLY ]SQLite에서 다른 ms-sql이나 mysql에 있는 rank 함수 쓸 수 있나요?
저기 마땅이 올릴곳이 없어서 여기에 올립니다.
2011/10/12 11:08 [ ADDR : EDIT/ DEL : REPLY ]데이터베이스 2번째 예재를
실행시키면 오류가 나더라구요 그래서 logcat을 둘러봤는데
android.database.sqlite.SQLiteException. table sites has no column named address. 라는데..
table sites 에 address 콜롬이 없다고 나오더라구요
근데 정확히 뭐가 문젠지.. 어디가 문제인지 모르겠네요 ㅠ
도와주세요
테이블을 생성할 때 address라는 컬럼을 넣지 않으셨나보네요. 아마 오타로 발생한 문제일 가능성이 큽니다.
2011/10/13 08:58 [ ADDR : EDIT/ DEL ]테이블 생성 코드를 한번 확인해보세요~
SQLiteQueryBuilder 에 projectMap을 지정하면 _id가 없는 테이블에서 CursorAdapter가 사용 가능합니다.
; 넣어서 사용하면 됩니다~
2012/02/14 19:13 [ ADDR : EDIT/ DEL : REPLY ]ProjectionMap으로 map.put("_id", "ROWID AS _id"
좋은정보 감사드립니다!!! XD
2012/02/15 00:33 [ ADDR : EDIT/ DEL ]