活动生命周期和数据库
问题描述:
我有一个应用程序从数据库表中读取值(数据库名为SoftCopyDatabase),并使用从数据库读取的值填充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(),因为我想控制数据库的打开和关闭。
答
这是正常的,因为这两种方法都执行......只是这样做的两种方法(onDestroy
和onStop
):
if(lectures.isOpen()){
lectures.close();
}
虽然我觉得你可以把一个.close
invokation在其中的一个。确保在SoftCopyDatabase
类中创建isOpen
方法,该方法必须调用SqliteDatabase
对象的isOpen
方法。
hmm..ok ...我会添加它。但是,当我已经包含了创建DataBase的新时刻的onRestart()方法时,为什么在返回到此Activity时未创建Database,以及为什么会显示此错误? –
首先:为什么显示错误?当您尝试对数据库执行某些操作(访问或关闭数据库)时会显示此消息,但它已关闭。简单,呃?关于'onRestart',在这里进行初始化是个不错的主意。 'onRestart'总是在'onCreate'后面调用的,所以你要创建这个类的两个实例:http://developer.android.com/reference/android/app/Activity.html – Cristian
Ahan,我明白你的观点。实际上,在我的应用程序的稍后部分中,显示已经打开dataBase的错误是显示的。为了解决这个错误,我使用了onStop并关闭了数据库。这解决了数据库已经打开的错误,但介绍了这一点。 我真的想知道的是,有一种方法可以让我在返回到此活动后立即重新打开数据库。 –