Siklus Hidup Aktivitas dan database

Saya memiliki aplikasi yang membaca nilai dari tabel Database (Database bernama SoftCopyDatabase) dan mengisi Daftar dengan nilai yang dibaca dari Database. Saat mengklik item dari daftar, Aktivitas Baru Dimulai.

Soalnya pas saya pencet tombol back malah error

          IllegalStateException: database already closed

Kode saya adalah sebagai berikut:

kelas publik OpenClick memperluas 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....

}

Satu hal yang ingin saya sampaikan adalah jika saya menghapus Metode onStop() maka aplikasi akan berfungsi dengan baik. Tapi saya harus memasukkan onstop() karena saya ingin mengontrol pembukaan dan penutupan Database.


person Waneya Iqbal    schedule 19.08.2011    source sumber


Jawaban (2)


Berikut ini artikel bagus yang membahas topik tersebut:

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

person Sgali    schedule 13.12.2011

Itu normal karena kedua metode dijalankan... lakukan saja ini pada kedua metode (onDestroy dan onStop):

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

Meskipun menurut saya Anda bisa memasukkan pemanggilan .close ke salah satunya. Pastikan untuk membuat metode isOpen di kelas SoftCopyDatabase Anda yang harus memanggil metode isOpen objek SqliteDatabase.

person Cristian    schedule 19.08.2011
comment
hmm..ok...saya akan menambahkannya. Tetapi ketika saya telah menyertakan metode onRestart() yang membuat DataBase instan baru, lalu mengapa Database tidak dibuat saat kembali ke Aktivitas ini dan mengapa kesalahan ini ditampilkan? - person Waneya Iqbal; 19.08.2011
comment
Pertama: mengapa kesalahan ditampilkan? Itu ditampilkan ketika Anda mencoba melakukan sesuatu pada database Anda (mengakses atau menutupnya), namun database tersebut sudah ditutup. Sederhana, ya? Dan sehubungan dengan onRestart, merupakan ide buruk untuk melakukan inisialisasi di sana. onRestart selalu dipanggil setelah onCreate, jadi Anda membuat dua instance kelas: developer .android.com/reference/android/app/Activity.html - person Cristian; 19.08.2011
comment
Ahan, aku mengerti maksudmu. Sebenarnya di beberapa bagian selanjutnya dalam aplikasi saya muncul kesalahan yang menyatakan database sudah dibuka. Untuk mengatasi kesalahan itu saya menggunakan onStop dan menutup Database. Ini memecahkan kesalahan Database sudah Dibuka, tetapi memperkenalkan yang ini. Yang sebenarnya ingin saya ketahui adalah apakah ada metode yang dapat saya gunakan untuk membuka kembali Database segera setelah saya kembali ke Aktivitas ini.? - person Waneya Iqbal; 19.08.2011
comment
Dan referensi siklus hidup aktivitas menunjukkan bahwa onStart dipanggil tepat setelah onCreate, bukan onRestart, yang dipanggil setelah onStop. - person Waneya Iqbal; 19.08.2011