태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

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

2009.09.20 16:59

데이터베이스에 담긴 정보를 리스트(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


저작자 표시 비영리 변경 금지
신고

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

  1. Blog Icon
    추어

    저도 떠서 고생했는데 완전 고맙습니다. ㅠ_ㅠ

  2. 이거때문에 한 몇일은 고생한것같아요 ㅠㅠ

  3. 아, 감사합니다~ 예전에도 잘 봤었는데 검색했더니 또 커니님 블로그 나와서 해결하네요 ^^

  4. Blog Icon
    지나가던 아저씨

    그렇다면 모든 도서관, 비디오방 관리 같은 복잡한 DB 쿼리 결과 SimpleCursorAdapter 사용해서 프로그램 하려면 모든 컬럼에 _id 필드가 붙어야한단말인가요???

  5. 모든 컬럼이 아니라 해당 테이블에 _id 필드가 있어야 한다는 뜻입니다. 사실, SimpleCUrsorAdapter 뿐만 아니라 자신이 직접 커서 어댑터를 상속받아 별도의 어댑터를 만들 때도 _id 필드가 있는 것이 훨씬 편리합니다.

  6. 아~~ 이것 때문에 고생했는데 여기 정답이 있군요. 좋은 정보 감사합니다.^^

  7. Blog Icon
    서현아빠

    좋은 정보 감사합니다~
    근데.. 위에 이미지를 보면 _id를 출력하지는 않으신 것 같은데
    어떻게 하면 출력하지 않을 수가 있을까요?
    출력할 필요는 없는데...
    이리저리 해봐도 _id가 사라지니 자꾸 에러가 나네요~
    제가 완전 초짜라서리...ㅋㅋ

  8. SimpleCursorAdapter를 사용하려면 id 필드가 꼭 필요합니다. 사용하지 않는 방법은 없습니다 ^^;

  9. 커서어댑터의 api내용을 살펴보면 다음과 같은 설명이 적혀있습니다 :

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

  10. Blog Icon
    서현아빠

    네~감사합니다. 블로그 내용 보고 알게되었습니다.
    그런데, 위에 스크린샷을 보니
    _id를 출력하지는 않으신 것 같아서 물어본 겁니다.
    출력하지 않는 방법은 없을까요?

  11. SimpleCursorAdapter에서 from, to 바인딩 해주실때 안해주시면 됩니다 ㅎㅎㅎ

  12. Blog Icon
    서현아빠

    그러게요~출력 안 하면 되네요~ㅋ 감사합니다.

  13. Blog Icon
    서현아빠

    좀 다른 질문이긴 한데...ㅋ
    SQLite에서 다른 ms-sql이나 mysql에 있는 rank 함수 쓸 수 있나요?

  14. Blog Icon
    공부중

    저기 마땅이 올릴곳이 없어서 여기에 올립니다.
    데이터베이스 2번째 예재를
    실행시키면 오류가 나더라구요 그래서 logcat을 둘러봤는데
    android.database.sqlite.SQLiteException. table sites has no column named address. 라는데..
    table sites 에 address 콜롬이 없다고 나오더라구요
    근데 정확히 뭐가 문젠지.. 어디가 문제인지 모르겠네요 ㅠ

    도와주세요

  15. 테이블을 생성할 때 address라는 컬럼을 넣지 않으셨나보네요. 아마 오타로 발생한 문제일 가능성이 큽니다.

    테이블 생성 코드를 한번 확인해보세요~

  16. SQLiteQueryBuilder 에 projectMap을 지정하면 _id가 없는 테이블에서 CursorAdapter가 사용 가능합니다.
    ProjectionMap으로 map.put("_id", "ROWID AS _id";); 넣어서 사용하면 됩니다~ :)

  17. 좋은정보 감사드립니다!!! XD