Android 活动生命周期与数据库

Android 活动生命周期与数据库,android,lifecycle,Android,Lifecycle,我有一个从数据库表中读取值的应用程序(数据库名为SoftCopyDatabase),并用从数据库读取的值填充列表。单击列表中的项目时,新活动开始 问题是,当我按下后退键时,出现了一个错误 IllegalStateException: database already closed 我的代码如下: 公共类OpenClick扩展ListActivity{ public static String subjectName; private SoftCopyDatabase lec

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

问题是,当我按下后退键时,出现了一个错误

          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(),因为我想控制数据库的打开和关闭。

这很正常,因为这两种方法都是执行的。。。只需在这两种方法上执行此操作(
onDestroy
onStop
):


尽管我认为您可以在其中一个中放置一个
.close
调用。确保在
SoftCopyDatabase
类中创建
isOpen
方法,该方法必须调用
SqliteDatabase
对象的
isOpen
方法。

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


尽管我认为您可以在其中一个中放置一个
.close
调用。确保在您的
SoftCopyDatabase
类中创建
isOpen
方法,该方法必须调用
SqliteDatabase
对象的
isOpen
方法。

下面是一篇介绍此主题的好文章:


这是一篇很好的文章,介绍了这个主题:


嗯……好的……我会加上它。但当我包含了onRestart()方法,它正在创建一个新的数据库瞬间,那么为什么在返回此活动时不创建数据库,为什么会显示此错误?首先:为什么会显示此错误?当您试图对数据库执行某些操作(访问或关闭数据库),但数据库已经关闭时,会显示此信息。简单,嗯?对于
onRestart
来说,在那里进行初始化是个坏主意
onRestart
总是在
onCreate
之后调用,因此您正在创建该类的两个实例:Ahan,我明白您的意思了。实际上,在我的应用程序后面的某个部分,会显示一个错误,说明数据库已经打开。为了解决这个错误,我使用了onStop并关闭了数据库。这解决了数据库已打开错误,但引入了此错误。我真正想知道的是,是否有任何方法可以让我在返回此活动时立即重新打开数据库。?活动生命周期引用显示,它是在onCreate之后调用的onStart,而不是onRestart,它是在onStop之后调用的。嗯……好的……我将添加它。但当我包含了onRestart()方法,它正在创建一个新的数据库瞬间,那么为什么在返回此活动时不创建数据库,为什么会显示此错误?首先:为什么会显示此错误?当您试图对数据库执行某些操作(访问或关闭数据库),但数据库已经关闭时,会显示此信息。简单,嗯?对于
onRestart
来说,在那里进行初始化是个坏主意
onRestart
总是在
onCreate
之后调用,因此您正在创建该类的两个实例:Ahan,我明白您的意思了。实际上,在我的应用程序后面的某个部分,会显示一个错误,说明数据库已经打开。为了解决这个错误,我使用了onStop并关闭了数据库。这解决了数据库已打开错误,但引入了此错误。我真正想知道的是,有什么方法可以让我在返回此活动时立即重新打开数据库。?活动生命周期引用显示,它是在onCreate之后调用的onStart,而不是在onStop之后调用的onRestart。
if(lectures.isOpen()){
    lectures.close();
}