마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

데이터베이스 아이템 삭제 질문드립니다. [closed]

0 추천
08-23 14:32:53.697: E/Trace(3697): error opening trace file: No such file or directory (2)
08-23 14:32:53.757: D/dalvikvm(3697): GC_FOR_ALLOC freed 37K, 6% free 2616K/2768K, paused 1ms, total 9ms
08-23 14:32:53.757: I/dalvikvm-heap(3697): Grow heap (frag case) to 3.738MB for 1127532-byte allocation
08-23 14:32:53.769: D/dalvikvm(3697): GC_FOR_ALLOC freed 2K, 5% free 3714K/3872K, paused 12ms, total 12ms
08-23 14:32:53.773: D/dalvikvm(3697): GC_CONCURRENT freed 0K, 5% free 3715K/3872K, paused 2ms+0ms, total 4ms
08-23 14:32:53.805: D/libEGL(3697): loaded /system/lib/egl/libEGL_emulation.so
08-23 14:32:53.809: D/(3697): HostConnection::get() New Host Connection established 0xb955c810, tid 3697
08-23 14:32:53.813: D/libEGL(3697): loaded /system/lib/egl/libGLESv1_CM_emulation.so
08-23 14:32:53.817: D/libEGL(3697): loaded /system/lib/egl/libGLESv2_emulation.so
08-23 14:32:53.869: W/EGL_emulation(3697): eglSurfaceAttrib not implemented
08-23 14:32:53.877: D/OpenGLRenderer(3697): Enabling debug mode 0
08-23 14:32:57.121: W/EGL_emulation(3697): eglSurfaceAttrib not implemented
08-23 14:32:59.485: D/AndroidRuntime(3697): Shutting down VM
08-23 14:32:59.485: W/dalvikvm(3697): threadid=1: thread exiting with uncaught exception (group=0xa61ed908)
08-23 14:32:59.485: E/AndroidRuntime(3697): FATAL EXCEPTION: main
08-23 14:32:59.485: E/AndroidRuntime(3697): android.database.sqlite.SQLiteConstraintException: PRIMARY KEY must be unique (code 19)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:727)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1665)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at test.dbtest2.MainActivity.InsertData(MainActivity.java:190)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at test.dbtest2.MainActivity.access$0(MainActivity.java:183)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at test.dbtest2.MainActivity$1.onClick(MainActivity.java:69)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.view.View.performClick(View.java:4204)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.view.View$PerformClick.run(View.java:17355)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.os.Handler.handleCallback(Handler.java:725)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.os.Looper.loop(Looper.java:137)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at android.app.ActivityThread.main(ActivityThread.java:5041)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at java.lang.reflect.Method.invokeNative(Native Method)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at java.lang.reflect.Method.invoke(Method.java:511)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-23 14:32:59.485: E/AndroidRuntime(3697):  at dalvik.system.NativeStart.main(Native Method)
08-23 14:32:59.489: D/dalvikvm(3697): GC_CONCURRENT freed 87K, 5% free 4012K/4216K, paused 2ms+1ms, total 4ms

위에는 로그캣 오류를 적어논 것이구요.

텍스트필드에 입력을 받아 입력받은 데이터를 데이터베이스에 넣고 데이터베이스에 있는 정보를 커서로 불러와 리스트뷰에 뿌려주는 프로그램입니다.

문제는 리스트뷰에 있는 아이템을 삭제후 (마지막 아이템이 아닌 다른 아이템) 다시 자료를 넣으려면 오류가 발생하고 꺼집니다.

그런데 마지막 아이템을 삭제하거나 데이터를 전부 삭제하면 프로그램이 잘 작동됩니다.

개인적인 생각에는 아이템 하나를 삭제했을 때 카운터가 줄어들어 마지막에 아이템이 들어와야 되는데 중간에 아이템이 없으니 그리로 들어가려고 하면서 오류가 발생했다고 생각합니다. 그런데 워낙 똥멍청이니 올바른 생각이 아닐거 같고 더욱이 해결방법도 몰라 이렇게 문의를 드립니다.

질문을 종료한 이유: 해결하였습니다
Android초보개발자 (1,230 포인트) 님이 2014년 8월 23일 질문
Android초보개발자님이 2015년 2월 13일 closed
에러내용을 해석해 드리면, "기본키는 고유한 값을 가져야 한다" 이구요.
SQLite database를 보면 각 테이블 안에 있는 row 값 중 최소 하나는 기본 키로 고유한 값을 가지고 있어야 합니다.
보통은 id 라고 하는 속성 이름 을 사용하며 integer 값으로 DB 생성시 sql 문으로 " id" + " INTEGER PRIMARY KEY AUTOINCREMENT, " 이런식으로 사용 합니다.
이 기본 키는 절대 NULL 또는 중복 될 수 없는 고유 값을 가져야 합니다.
디테일하게 설명하기는 복잡하니 count 계산에 사용하는 값이 아니고 DB 에서 row 자료를 인식하기 위한 열쇠와 같은 것으로 이해 하시면 될 겁니다.
...