2012-10-15 2 views
0

데이터베이스에서 채워지는 ListView와 관련된 문제가 다시 발생했습니다. 데이터베이스에 대한 OnClickListener 만들기 위해 노력하고있어 및 나에게 올바른 것, 그러나 코드를 잘못된 상태 예외를 생성합니다.ListView가 데이터베이스로 채워집니다. 항목 선택으로 인해 런타임 예외가 발생합니다.

코드 :

private void getData() { 
    db.open(); 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      db.getAllSubjects(), 
      new String[] { "subject" }, 
      new int[] { android.R.id.text1 }); 

    ListView listView = (ListView) findViewById(android.R.id.list); 
    listView.setAdapter(adapter); 
    listView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long id) 
     { 
     Cursor cursor = db.getSubject(id); 
     String subject = null; 
     try { 
      subject = cursor.getString(cursor.getColumnIndex("subject")); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Intent intent = new Intent(Main.this, Marks.class); 
     intent.putExtra("selected", subject); 
     startActivity(intent); 
     db.close(); 
     } 
    }); 
} 

로그 캣 : 당신의 도움에 대한

10-15 15:41:10.674: E/AndroidRuntime(23675): FATAL EXCEPTION: main 
10-15 15:41:10.674: E/AndroidRuntime(23675): java.lang.IllegalStateException: database /data/data/maturaarbeit.nicola_pfister.marks/databases/database (conn# 0) already closed 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2082) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1445) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1405) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at maturaarbeit.nicola_pfister.marks.database.DBAdapter.getSubject(DBAdapter.java:137) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at maturaarbeit.nicola_pfister.marks.Main$1.onItemClick(Main.java:59) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.widget.AdapterView.performItemClick(AdapterView.java:292) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.widget.AbsListView.performItemClick(AbsListView.java:1058) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.widget.AbsListView$1.run(AbsListView.java:3168) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.os.Handler.handleCallback(Handler.java:605) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.os.Looper.loop(Looper.java:137) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at android.app.ActivityThread.main(ActivityThread.java:4424) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at java.lang.reflect.Method.invokeNative(Native Method) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at java.lang.reflect.Method.invoke(Method.java:511) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
10-15 15:41:10.674: E/AndroidRuntime(23675): at dalvik.system.NativeStart.main(Native Method) 

감사합니다! 당신이 onItemClick 당신에게 데이터베이스를 닫습니다 않기 때문이다

+0

getSubject()가 호출되면 데이터베이스가 닫힙니다. 열어 봐. – Geobits

+0

선택한 각 항목에서 db를 종료합니다. 그냥 응용 프로그램을 떠날 때 닫습니다 – njzk2

답변

1

. 따라서 두 번째 시간을 클릭하면 onItemClick이 다시 호출되지만 데이터베이스는 이미 닫혔습니다.

+0

좋아, 모든 db.open() 및 db.close() 제외한 onResume db.open() 및 db.close() onPause 제외한. 그것에 대해 생각하면,이 방법은 데이터베이스를 항상 열고 닫는 것보다 더 효율적입니다 ... – BlueHazard

관련 문제