Android 由数据库填充的ListView;项目选择导致运行时异常

Android 由数据库填充的ListView;项目选择导致运行时异常,android,database,listview,illegalstateexception,Android,Database,Listview,Illegalstateexception,关于由数据库填充的ListView,我再次遇到了一些问题。我试图为数据库创建一个OnClickListener,我认为它是正确的,但是代码产生了一个非法的状态异常 代码: 谢谢你的帮助 这是因为您确实在onItemClick中关闭了数据库。因此,当您第二次单击时,会再次调用onItemClick,但数据库已经关闭 调用getSubject()时,数据库将关闭。打开它。您正在关闭每个选定项的数据库。当您离开appOk时,我删除了所有的db.open()和db.close(),除了onResume中

关于由数据库填充的ListView,我再次遇到了一些问题。我试图为数据库创建一个OnClickListener,我认为它是正确的,但是代码产生了一个非法的状态异常

代码:


谢谢你的帮助

这是因为您确实在
onItemClick
中关闭了数据库。因此,当您第二次单击时,会再次调用onItemClick,但数据库已经关闭

调用
getSubject()
时,数据库将关闭。打开它。您正在关闭每个选定项的数据库。当您离开appOk时,我删除了所有的db.open()和db.close(),除了onResume中的db.open()和onPause中的db.close()。仔细想想,这种方法可能比一直打开和关闭数据库更有效。。。
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)