When you rotate the phone while in MainActivity, the application crashes and issues such an event.
MainActivity
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, LoaderManager.LoaderCallbacks<Cursor> { ExpandableListView expList; DBHeler db; ExpListAdapter adapter; final private static int LOADER = 1; private int currentLoader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = new DBHeler(this); String[] groupFrom = { Contract.Entry.COLUMN_NAME }; int[] groupTo = { android.R.id.text1 }; String[] childFrom = { Contract.Entry.COLUMN_NAME }; int[] childTo = { android.R.id.text1 }; adapter = new ExpListAdapter( this, null, R.layout.item_group, // разметка корневых айтемов groupFrom, groupTo, R.layout.item, // разметка вложенных айтемов childFrom, childTo); expList = (ExpandableListView) findViewById(R.id.expList); expList.setGroupIndicator(null); expList.setAdapter(adapter); getSupportLoaderManager().initLoader(LOADER, null, this); } @Override protected void onResume() { super.onResume(); expList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) { Intent intent = new Intent(MainActivity.this, Dish.class); long id = l; intent.putExtra("id", id); startActivity(intent); return true; } }); getSupportLoaderManager().restartLoader(currentLoader, null, this); } static class MyCursorLoader extends CursorLoader { DBHeler dbHeler; final int loaderID; public MyCursorLoader(Context context, DBHeler dbHeler, int id) { super(context); this.dbHeler = dbHeler; loaderID = id; } @Override protected Cursor onLoadInBackground() { return dbHeler.getCategory(); } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle bundle) { return new MyCursorLoader(this, db, id); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { adapter.changeCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { adapter.changeCursor(null); } } Code for DB
public class DBHeler extends SQLiteOpenHelper { private static String DB_PATH; private static final String DATABASE_NAME = "dbase.db"; private static final int DATABASE_VERSION = 1; public SQLiteDatabase database; private Context myContext; public DBHeler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.myContext = context; try { //получаем путь до БД вместе с именем. DB_PATH = myContext.getDatabasePath(DATABASE_NAME).toString(); createDataBase(); openDataBase(); } catch (IOException e) { e.printStackTrace(); } } public Cursor getSingleDost(long id) { return this.getReadableDatabase().query(Contract.Entry.TABLE_DOST, null, Contract.Entry._ID + " = " + id, null, null, null, null); } public Cursor getFavoritesDost() { return database.query(Contract.Entry.TABLE_DOST, null, Contract.Entry.COLUMN_FAVORITE + " = 1", null, null, null, null); } public Cursor getCategory() { return this.getReadableDatabase().query(Contract.Entry.TABLE_CATEGORY, null, null, null, null, null, null); } public Cursor getDost(long categoryID) { return this.getReadableDatabase().query(Contract.Entry.TABLE_DOST, null, Contract.Entry.COLUMN_CATEGORYID + " = " + categoryID, null, null, null, null); } public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (!dbExist) { this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } private boolean checkDataBase(){ SQLiteDatabase checkDB = null; try { checkDB = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { // база не существует } if (checkDB != null) { checkDB.close(); } return checkDB != null; } private void copyDataBase() throws IOException { InputStream myInput = myContext.getAssets().open(DATABASE_NAME); String outFileName = DB_PATH; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer))>0){ myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } public void openDataBase() throws SQLException { database = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE); } @Override public synchronized void close() { if(database != null) database.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } Mistake
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: SELECT * FROM category at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:58) at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:151) at android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:123) at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:236) at android.widget.CursorTreeAdapter$MyCursorHelper.moveTo(CursorTreeAdapter.java:446) at android.widget.CursorTreeAdapter.getGroupView(CursorTreeAdapter.java:196) at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:446) at android.widget.AbsListView.obtainView(AbsListView.java:2934) at android.widget.ListView.makeAndAddView(ListView.java:1945) at android.widget.ListView.fillDown(ListView.java:719) at android.widget.ListView.fillFromTop(ListView.java:785) at android.widget.ListView.layoutChildren(ListView.java:1721) at android.widget.AbsListView.onLayout(AbsListView.java:2728) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:131) at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42) at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1375) at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:870) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1193) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) at android.widget.FrameLayout.onLayout(FrameLayout.java:281) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) at android.widget.FrameLayout.onLayout(FrameLayout.java:281) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) at android.widget.FrameLayout.onLayout(FrameLayout.java:281) at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:3129) at android.view.View.layout(View.java:17972) at android.view.ViewGroup.layout(ViewGroup.java:5814) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2669) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2370) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1440) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7421) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920) at android.view.Choreographer.doCallbacks(Choreographer.java:695) at android.view.Choreographer.doFrame(Choreographer.java:631) at android.view.Choreographer$FrameDisplayEventRec What could be the reason?
IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: SELECT * FROM categoryyou are trying to make a query to the database through a dead connection to it. - Yuriy SPb ♦DBHelperyou need toreturn this.getReadableDatabase().query()with thereturn database.query()method ingetCategory(),getDost(),getSingleDost()methods - pavlofff