태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.

티스토리 툴바



이 게시물을 무단으로 사용하는 행위(비영리, 영리 포함)는 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


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License


안드로이드 정보, 강좌를 누구보다 빨리 접하고 싶으신가요?

그렇다면 이메일 구독 혹은  구글 리더에 피드 추가 를 통해 업데이트되는 최신 글들을 받아보실 수 있습니다. :)




TRACKBACK http://androidhuman.tistory.com/trackback/255 관련글 쓰기

댓글을 달아 주세요

  1. 추어

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

    2009/12/24 16:22 [ ADDR : EDIT/ DEL : REPLY ]
    • 이거때문에 한 몇일은 고생한것같아요 ㅠㅠ

      2009/12/24 17:07 [ ADDR : EDIT/ DEL ]
  2. 아, 감사합니다~ 예전에도 잘 봤었는데 검색했더니 또 커니님 블로그 나와서 해결하네요 ^^

    2010/10/05 12:58 [ ADDR : EDIT/ DEL : REPLY ]
  3. 지나가던 아저씨

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

    2011/02/19 16:20 [ ADDR : EDIT/ DEL : REPLY ]
    • 모든 컬럼이 아니라 해당 테이블에 _id 필드가 있어야 한다는 뜻입니다. 사실, SimpleCUrsorAdapter 뿐만 아니라 자신이 직접 커서 어댑터를 상속받아 별도의 어댑터를 만들 때도 _id 필드가 있는 것이 훨씬 편리합니다.

      2011/02/21 13:28 [ ADDR : EDIT/ DEL ]
  4. 아~~ 이것 때문에 고생했는데 여기 정답이 있군요. 좋은 정보 감사합니다.^^

    2011/06/14 13:52 [ ADDR : EDIT/ DEL : REPLY ]
  5. 서현아빠

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

    2011/08/01 19:03 [ ADDR : EDIT/ DEL : REPLY ]
    • SimpleCursorAdapter를 사용하려면 id 필드가 꼭 필요합니다. 사용하지 않는 방법은 없습니다 ^^;

      2011/08/02 00:34 [ ADDR : EDIT/ DEL ]
    • 커서어댑터의 api내용을 살펴보면 다음과 같은 설명이 적혀있습니다 :

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

      2011/08/02 00:35 [ ADDR : EDIT/ DEL ]
  6. 서현아빠

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

    2011/08/02 10:00 [ ADDR : EDIT/ DEL : REPLY ]
    • SimpleCursorAdapter에서 from, to 바인딩 해주실때 안해주시면 됩니다 ㅎㅎㅎ

      2011/08/03 00:38 [ ADDR : EDIT/ DEL ]
  7. 서현아빠

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

    2011/08/03 13:08 [ ADDR : EDIT/ DEL : REPLY ]
  8. 서현아빠

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

    2011/08/08 00:00 [ ADDR : EDIT/ DEL : REPLY ]
  9. 공부중

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

    도와주세요

    2011/10/12 11:08 [ ADDR : EDIT/ DEL : REPLY ]
    • 테이블을 생성할 때 address라는 컬럼을 넣지 않으셨나보네요. 아마 오타로 발생한 문제일 가능성이 큽니다.

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

      2011/10/13 08:58 [ ADDR : EDIT/ DEL ]
  10. SQLiteQueryBuilder 에 projectMap을 지정하면 _id가 없는 테이블에서 CursorAdapter가 사용 가능합니다.
    ProjectionMap으로 map.put("_id", "ROWID AS _id";); 넣어서 사용하면 됩니다~ :)

    2012/02/14 19:13 [ ADDR : EDIT/ DEL : REPLY ]