活动生命周期和数据库

问题描述:

我有一个应用程序从数据库表中读取值(数据库名为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(),因为我想控制数据库的打开和关闭。

这是正常的,因为这两种方法都执行......只是这样做的两种方法(onDestroyonStop):

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

虽然我觉得你可以把一个.close invokation在其中的一个。确保在SoftCopyDatabase类中创建isOpen方法,该方法必须调用SqliteDatabase对象的isOpen方法。

+0

hmm..ok ...我会添加它。但是,当我已经包含了创建DataBase的新时刻的onRestart()方法时,为什么在返回到此Activity时未创建Database,以及为什么会显示此错误? –

+0

首先:为什么显示错误?当您尝试对数据库执行某些操作(访问或关闭数据库)时会显示此消息,但它已关闭。简单,呃?关于'onRestart',在这里进行初始化是个不错的主意。 'onRestart'总是在'onCreate'后面调用的,所以你要创建这个类的两个实例:http://developer.android.com/reference/android/app/Activity.html – Cristian

+0

Ahan,我明白你的观点。实际上,在我的应用程序的稍后部分中,显示已经打开dataBase的错误是显示的。为了解决这个错误,我使用了onStop并关闭了数据库。这解决了数据库已经打开的错误,但介绍了这一点。 我真的想知道的是,有一种方法可以让我在返回到此活动后立即重新打开数据库。 –