活动生命周期和数据库

时间:2011-08-19 18:24:12

标签: android lifecycle

我有一个应用程序从Database表中读取值(Database名为SoftCopyDatabase),并使用从Database中读取的值填充List。单击列表中的项目时,“新建活动开始”。

问题是当我按后退键时出现错误

          IllegalStateException: database already closed

我的代码如下:

公共类OpenClick扩展了ListActivity {

public static String subjectName;
private SoftCopyDatabase lectures;
private static int[] subTO = { R.id.subject };
private static String[] subFROM = { SUBJECT };

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    lectures = new SoftCopyDatabase(this);

}

public void onStart() {
    super.onStart();

    try {
        Cursor cursor = getSubjects();
        showSubjects(cursor);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void onRestart() {
    super.onRestart();
    lectures = new SoftCopyDatabase(this);

}

public void onStop() {
    super.onStop();
    lectures.close();
}

public void onDestroy() {
    super.onDestroy();
    lectures.close();
}
//remaining code....

}

我想提一点的是,如果我删除onStop()方法,应用程序正常工作。但我必须包含onstop(),因为我想控制数据库的打开和关闭。

2 个答案:

答案 0 :(得分:3)

这是一篇很好的文章,涵盖了这个主题:

http://awiden.wordpress.com/2010/03/26/database-mangement-and-the-activity-lifecycle/

答案 1 :(得分:1)

这是正常的,因为两种方法都已执行...只需在两种方法(onDestroyonStop)上执行此操作:

if(lectures.isOpen()){
    lectures.close();
}

虽然我认为你可以在其中一个中加入.close调用。请务必在isOpen课程中创建SoftCopyDatabase方法,该方法必须调用SqliteDatabase对象的isOpen方法。