استثناء الدولة غير القانوني:قاعدة البيانات مغلقة بالفعل (باستخدام ViewPager)

StackOverflow https://stackoverflow.com//questions/12702254

سؤال

أنا في حيرة من أمري بشأن سبب هذا الخطأ، حيث أنني تأكدت من أنني أغلق محول قاعدة البيانات بشكل صحيح (على الأقل أعتقد أنني كذلك).إليك ما يقوله LogCat (العلامة الخاصة بهم جميعًا هي AndroidRuntime):

استثناء فادح:Main Java.lang.IlegalStateException:database /data/data/com.acedit.assignamo/databases/data.db (conn# 0) تم إغلاقه بالفعل في Android.database.sqlite.sqlitedatabase.verifydbisopen (sqlitedatabase.java:2082) at android.database.sqlite.sqloittaben. lock (sqlitedatabase.java:413) في Android.database.sqlite.sqlitedatabase.lock . cursoradapter.getitemid (cursoradapter.java:25) في Android.widget.abslistview.onsaveInstancestate (ApplistView.java:1569) في Android.View.view.dispatchSaveInstanCestate (view.java:9868) .java: 2310) في Android.widget.adapterview.dispatchsaveinstancestate (AdapterView.java:770) في Android.View.viewGroup.DispatchSaveInstancestate (viewgroup.java:2296) at android.view.saveherashystate ( في Android.support.v4.app.fragmentManagerImpl.SaveFragmentViewState (FragmentManager.java:1561) at Android.suport.v4.app.fragmentmanagerimpl.Movetostate (FragmentManager.java:962) (FragmentManager.java:1233) في Android.support.v4.app.backstackrecord.run (backstackrecord.java:620) في Android.support.v4.app.fragmentManagerimpl.execpendingActions (fragmentmanager.java:1431) v4.app.fragmentManagerImpl.ExecutePendingTransactions (FragmentManager.java:431) في Android.suport.v4.app.fragmentpageradapter.finishupdate (purgmentPagerAdapter.java:141) at android.V4. 895) في Android.support.v4.view.viewpager.populate (viewpager.java:772) في Android.support.v4 .ComputesCroll (viewpager.java:1422) في Android.View.view.getDisplayList (view.java:10406) على Android.View.view.geDisplayList (viewgroup.java:2597) في Android.View.GetDisplist (عرض. Java: 10380) في Android.View.viewGroup.DispatchgetDisplayList (ViewGroup.java:2597) في Android.View.getDisplayList (View.java:10380) في Android.ViewGroup.DispatchgetDiSplay ( Android.view.view.getDisplayList (view.java:10380) على Android.view.viewgroup.dispatchgetDisplayList (viewgroup.java:2597) على Android.view.getDisplayList ( $ glrenderer.draw (hardwarerenderer.java:875) at Android.View.ViewRootimpl.Draw (viewRootimpl.java:1910) at Android.View.Viewtimpl.performtraversals (ViewRootimpl.java:1634) at android.view.view.viewpl. ViewRootimpl.java:2442) في Android.Os.Handler.DispatchMessage (Handler.java:99) في Android.Os.Looper.loop (looper.java:137) في Android.App.activitythread.main (Activitythread.java:4575575575 ) في java.lang.reflect.method.invokenative (الطريقة الأصلية) في java.lang.reflect.method.invoke (method.java:511) في com.android.internal.os.zygoteinit $ methodandargscaller.run (zygoteinit.java. : 786) في com.android.internal.os.zygoteinit.main (zygoteinit.java:553) في dalvik.system.nativestart.main (الطريقة الأصلية)

رمز بلدي:

public Cursor fetchIncompleteAssignments(Short course) {
    DbAdapter adapter = new DbAdapter(context, null, Values.ASSIGNMENT_TABLE);
    adapter.open();

    Cursor r;
    if (course == null) // Fetching from all courses
        r = adapter.fetchAllWhere(Values.ASSIGNMENT_LIST_FETCH, Values.ASSIGNMENT_KEY_STATUS + "=" + 0, Values.ASSIGNMENT_KEY_DUE_DATE);
    else
        r = adapter.fetchAllWhere(Values.ASSIGNMENT_LIST_FETCH, Values.ASSIGNMENT_KEY_COURSE + "=" + course
            + " AND " + Values.ASSIGNMENT_KEY_STATUS + "=" + 0, Values.ASSIGNMENT_KEY_DUE_DATE);
    adapter.close();
    return r;
}

// Part of DbAdapter:
public DbAdapter open() throws SQLException {
    dbHelper = new DatabaseHelper(context);
    db = dbHelper.getWritableDatabase();
    return this;
}

public void close() {
    if (db != null) {
        try {
            db.close();
            dbHelper.close();
        } catch (NullPointerException e) {
            Log.e("Close", "Error: " + e + " " + e.getMessage());
        }
    } else
        Log.e("Close", "Error! db \"" + DATABASE_TABLE + "\" is null.");
}

ال Cursor عاد من fetchAllAssignments() يستخدم لملء أ ListView من خلال العرف CursorAdapter.ال ListView هو محتوى أ ListFragment, ، وهناك مثيلات متعددة لـ ListFragment معروضة في كل صفحة من صفحة ViewPager (واحدة لعرض الواجبات من جميع الدورات التدريبية، ثم صفحة لكل دورة من الدورات التدريبية الفردية).

أي أفكار حول ما هو الخطأ؟بقدر ما أعرف، أنا أغلق قاعدة البيانات الخاصة بي بشكل صحيح.اسمحوا لي أن أعرف إذا كنت بحاجة إلى المزيد من التعليمات البرمجية.شكرا لك مقدما!

يحرر: يتم سحب البيانات من قاعدة البيانات بشكل جيد، ويتم ملء ListView أيضًا.يمكنني التمرير خلال الصفحات المختلفة، ولكن يبدو أنها تتعطل عندما يتم إيقاف الجزء.غالبًا ما يتعطل عندما أبدأ نشاطًا آخر، ولكن ليس دائمًا.كما أنه سيتعطل أحيانًا عندما أقوم بالتمرير عبر الصفحات، على الرغم من أنه نادرًا جدًا.هذه هي طريقة onPause() الخاصة بالجزء الخاص بي (ليس لدي onStop() أو onDestroy()):

public void onPause() {
    super.onPause();
    if (!assignmentsCursor.isClosed()) {
        assignmentsCursor.close();
        assignmentsCursor = null;
    }
}

في onResume() أقوم فقط بإعادة تحميل القائمة من قاعدة البيانات والحصول على نسخة جديدة من السياق عبر getActivity().ربما يتم مسح شيء ما (لأغراض الذاكرة) ولا أقوم بإعادة تحميله؟لا أحصل على أي نوع من NullPointerException، لذلك يبدو هذا غير مرجح بالنسبة لي...

هل كانت مفيدة؟

المحلول

في الواقع، يظهر هذا الاستثناء لأنك قمت بإغلاق قاعدة بياناتك مرتين، وليس لأنك لم تغلقها.

لذا..

فيك close() الطريقة، استبدل السطر التالي في الكود الخاص بك:

if (db != null) {

مع:

if (db != null && db.isOpen()) {

نصائح أخرى

جعل الخاص بك DbHelper المفرد, كما هو موضح في هذا المنصب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top