Intereting Posts
Android с несколькими контент-провайдерами (DLC) Кнопка появляется в API API 19, но не API 17 Espresso NoMatchingViewException при использовании withId Как я могу настроить тип настраиваемого аккаунта в приложении для контактов Android? React-native slow on android 5.1.1, но отлично подходит для старых 5.1 Phonegap (Android Build) – Промежуточный экран перед экраном всплеска Android notification большое изображение не работает Почему кнопки растягиваются, чтобы покрыть все выделенные макеты Как выполнять поиск по номеру T9 по телефону в Android Использование iPad с 11 Fingers … Расширение лимита Android в коде Сбой сохранения состояния – цель не в менеджере фрагментов (setTargetFragment) Видео установлено в «истинный» в URI видеочата Skype, но видео не активируется при запуске вызова Null pointer Exception – findViewById () Как сделать подписанную и запутанную сборку релиза Android из внутреннего затмения? Android исключает файл из сборки в eclipse

IllegalStateException: база данных уже закрыта (с использованием ViewPager)

Я в тупике о том, что вызывает эту ошибку, поскольку я убедился, что я правильно закрываю свой адаптер базы данных (по крайней мере, я думаю, что я). Вот что говорит LogCat (тег для всех из них – AndroidRuntime):

FATAL EXCEPTION: main java.lang.IllegalStateException: database /data/data/com.acedit.assignamo/databases/data.db (conn # 0) уже закрыт в android.database.sqlite.SQLiteDatabase.verifyDbIsOpen (SQLiteDatabase.java:2082 ) В android.database.sqlite.SQLiteDatabase.lock (SQLiteDatabase.java:413) в android.database.sqlite.SQLiteDatabase.lock (SQLiteDatabase.java:400) в android.database.sqlite.SQLiteQuery.fillWindow (SQLiteQuery.java: 79) в android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:164) в android.database.sqlite.SQLiteCursor.onMove (SQLiteCursor.java:147) в android.database.AbstractCursor.moveToPosition (AbstractCursor.java:178 ) В файле android.support.v4.widget.CursorAdapter.getItemId (CursorAdapter.java:225) в android.widget.AbsListView.onSaveInstanceState (AbsListView.java:1569) в android.view.View.dispatchSaveInstanceState (View.java:9868) В android.view.ViewGroup.dispatchFreezeSelfOnly (ViewGroup.java:2310) в файле android.widget.AdapterView.dispatchSaveInstanceState (Adapt ErView.java:770) в android.view.ViewGroup.dispatchSaveInstanceState (ViewGroup.java:2296) в android.view.View.saveHierarchyState (View.java:9851) в android.support.v4.app.FragmentManagerImpl.saveFragmentViewState (FragmentManager .java: 1561) в файле android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:962) в файле android.support.v4.app.FragmentManagerImpl.detachFragment (FragmentManager.java:1233) на android.support.v4. App.BackStackRecord.run (BackStackRecord.java:620) в android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1431) в android.support.v4.app.FragmentManagerImpl.executePendingTransactions (FragmentManager.java:431) В файле android.support.v4.app.FragmentPagerAdapter.finishUpdate (FragmentPagerAdapter.java:141) в файле android.support.v4.view.ViewPager.populate (ViewPager.java:895) в файле android.support.v4.view.ViewPager.populate (ViewPager.java:772) на android.support.v4.view.ViewPager.completeScroll (ViewPager.java:1539) на android.support.v4.view.V IewPager.computeScroll (ViewPager.java:1422) в android.view.View.getDisplayList (View.java:10406) в android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597) в android.view.View.getDisplayList (просмотр .java: 10380) в android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597) в android.view.View.getDisplayList (View.java:10380) в android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597) На android.view.View.getDisplayList (View.java:10380) на android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597) на android.view.View.getDisplayList (View.java:10380) на android.view. HardwareRenderer $ GlRenderer.draw (HardwareRenderer.java:875) в android.view.ViewRootImpl.draw (ViewRootImpl.java:1910) в android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1634) в android.view.ViewRootImpl.handleMessage (ViewRootImpl.java:2442) на android.os.Handler.dispatchMessage (Handler.java:99) на android.os.Looper.loop (Looper.java:137) на android.app.ActivityThread.main (Activi TyThread.java:4575) в java.lang.reflect.Method.invokeNative (собственный метод) в java.lang.reflect.Method.invoke (Method.java:511) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller. (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 , и на каждой странице ViewPager отображаются несколько экземпляров этого списка, который отображается на каждой странице ViewPager (один для отображения назначений со всех курсов, а затем страницы для каждого из отдельных курсов).

Любые идеи относительно того, что не так? Насколько я знаю, я правильно закрываю свою базу данных. Дайте мне знать, если вам нужно больше кода. Заранее спасибо!

EDIT: данные извлекаются из базы данных в порядке, а также заполняет 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 синглтон, как описано в этой статье .