Жизненный цикл деятельности и база данных

У меня есть приложение, которое считывает значения из таблицы базы данных (база данных называется 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(), потому что я хочу контролировать открытие и закрытие базы данных.


person Waneya Iqbal    schedule 19.08.2011    source источник


Ответы (2)


Вот хорошая статья по теме:

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

person Sgali    schedule 13.12.2011

Это нормально, потому что выполняются оба метода... просто сделайте это для обоих методов (onDestroy и onStop):

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

Хотя я думаю, что вы можете просто поместить вызов .close в один из них. Обязательно создайте метод isOpen в классе SoftCopyDatabase, который должен вызывать метод isOpen объекта SqliteDatabase.

person Cristian    schedule 19.08.2011
comment
хм..хорошо...я добавлю. Но когда я включил метод onRestart(), который создает новый момент базы данных, то почему база данных не создается при возврате к этому действию и почему отображается эта ошибка? - person Waneya Iqbal; 19.08.2011
comment
Во-первых: почему отображается ошибка? Это проявляется, когда вы пытаетесь что-то сделать с вашей базой данных (получить доступ к ней или закрыть ее), но она уже закрыта. Просто, а? И что касается onRestart, это плохая идея иметь там инициализацию. onRestart всегда вызывается после onCreate, поэтому вы создаете два экземпляра класса: developer .android.com/reference/android/app/Activity.html - person Cristian; 19.08.2011
comment
Ахан, я понял твою мысль. На самом деле в какой-то более поздней части моего приложения отображается ошибка с указанием уже открытой базы данных. Чтобы решить эту ошибку, я использовал onStop и закрыл базу данных. Это решило ошибку «База данных уже открыта», но вводит эту. Что я на самом деле хочу знать, есть ли какой-либо метод, с помощью которого я могу снова открыть базу данных, как только вернусь к этому действию? - person Waneya Iqbal; 19.08.2011
comment
И ссылка на жизненный цикл активности показывает, что onStart вызывается сразу после onCreate, а не onRestart, который вызывается после onStop. - person Waneya Iqbal; 19.08.2011