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

안드로이드 초보입니다.. 문제가 뭘가요?..

0 추천
okbtn1.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    String a = "yes";
    // TODO Auto-generated method stub
    sqldb = db.getWritableDatabase();
    db.onUpgrade(sqldb, 1, 2);
    sqldb.close();
    sqldb = db.getWritableDatabase();
    sqldb.execSQL("INSERT INTO CallDB VALUES("
      +number1.getText().toString()+");");
    sqldb.close();
    Toast.makeText(getApplicationContext(),a , Toast.LENGTH_SHORT).show();
   }
  });
     btn1.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    cursor = sqldb.rawQuery("SELECT * FROM CallDB;",null);
    String  b = cursor.getString(0);
    test1.setText(b);
    cursor.close();
    sqldb.close();
    
   }
  });

그냥생각나는대로 써봣는데요 DB에 하나만 저장해야되서 버튼1클릭하면 초기화시키고 하나만 입력받게 해놧고 버튼2 클릭하면 뭐가 들어있는지 출력하게 했는데 안돼요.. 뭐가 문제일가요??

12-03 23:48:30.147: W/dalvikvm(2247): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
12-03 23:48:30.407: E/AndroidRuntime(2247): FATAL EXCEPTION: main
12-03 23:48:30.407: E/AndroidRuntime(2247): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.jiminjimin/databases/CallDB
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1310)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at com.example.jiminjimin.Edit$2.onClick(Edit.java:53)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.view.View.performClick(View.java:4240)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.view.View$PerformClick.run(View.java:17721)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.os.Handler.handleCallback(Handler.java:730)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.os.Looper.loop(Looper.java:137)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at android.app.ActivityThread.main(ActivityThread.java:5103)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at java.lang.reflect.Method.invokeNative(Native Method)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at java.lang.reflect.Method.invoke(Method.java:525)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-03 23:48:30.407: E/AndroidRuntime(2247):  at dalvik.system.NativeStart.main(Native Method)
지미니v (1,080 포인트) 님이 2013년 12월 4일 질문

1개의 답변

0 추천
sqldb를 close 하셨네요.

 

보통 디비를 사용할때 매 쿼리마다 open, close를 하지 않습니다.

자주 하면 이것도 오버해드니까요.

 

저 같은 경우 디비를 사용해야 하는 앱의 경우

싱글턴 패턴으로 디비를 사용합니다. 앱 실행시 디비를 open하고

앱 종료시 close 합니다. 그 사이에는 다시 open 및 close를 하지 않습니다.

물론 저처럼 하는 것이 정석은 아닙니다. 디비 open, close는 각 상황에 맞게 잘 하시면 됩니다.

 

결론은 디비를 close 한 후에 버튼을 클릭하여 디비작업을 시도한 것이 원인입니다.
원조안드로이드 (58,190 포인트) 님이 2013년 12월 4일 답변
...