android - Error: attempt to re-open an already-closed object: SQLiteQuery -


i have read through other questions similar unable resolve problem.

i attempting query data base , use results populate list view. can see in code have done in several different ways ie. return array lists etc. particular list trying return cursor , send custom adapter. following error:

07-11 10:55:27.192  30405-30405/? e/androidruntime﹕ fatal exception: main process: com.bkane56.practice.practiceapp, pid: 30405 java.lang.illegalstateexception: attempt re-open already-closed  object: sqlitequery: select stop_name, stop_lat, stop_lon, _id stops         @ android.database.sqlite.sqliteclosable.acquirereference(sqliteclosable.java:55)         @ android.database.sqlite.sqlitequery.fillwindow(sqlitequery.java:58)         @ android.database.sqlite.sqlitecursor.fillwindow(sqlitecursor.java:152)         @ android.database.sqlite.sqlitecursor.onmove(sqlitecursor.java:124)         @ android.database.abstractcursor.movetoposition(abstractcursor.java:214)         @ android.widget.cursoradapter.getview(cursoradapter.java:245)         @ android.widget.abslistview.obtainview(abslistview.java:2347)         @ android.widget.listview.measureheightofchildren(listview.java:1270)         @ android.widget.listview.onmeasure(listview.java:1182)         @ android.view.view.measure(view.java:17547)         @ android.widget.relativelayout.measurechildhorizontal(relativelayout.java:727)         @ android.widget.relativelayout.onmeasure(relativelayout.java:463)         @ android.view.view.measure(view.java:17547)         @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5535)         @ android.widget.framelayout.onmeasure(framelayout.java:436)         @ android.view.view.measure(view.java:17547)         @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5535)         @ android.widget.linearlayout.measurechildbeforelayout(linearlayout.java:1436)         @ android.widget.linearlayout.measurevertical(linearlayout.java:722)         @ android.widget.linearlayout.onmeasure(linearlayout.java:613)         @ android.view.view.measure(view.java:17547)         @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:5535)         @ android.widget.framelayout.onmeasure(framelayout.java:436)         @ com.android.internal.policy.impl.phonewindow$decorview.onmeasure(phonewindow.java:2615)         @ android.view.view.measure(view.java:17547)         @ android.view.viewrootimpl.performmeasure(viewrootimpl.java:2015)         @ android.view.viewrootimpl.measurehierarchy(viewrootimpl.java:1173)         @ android.view.viewrootimpl.performtraversals(viewrootimpl.java:1379)         @ android.view.viewrootimpl.dotraversal(viewrootimpl.java:1061)         @ android.view.viewrootimpl$traversalrunnable.run(viewrootimpl.java:5885)         @ android.view.choreographer$callbackrecord.run(choreographer.java:767)         @ android.view.choreographer.docallbacks(choreographer.java:580)         @ android.view.choreographer.doframe(choreographer.java:550)         @ android.view.choreographer$framedisplayeventreceiver.run(choreographer.java:753)         @ android.os.handler.handlecallback(handler.java:739)         @ android.os.handler.dispatchmessage(handler.java:95)         @ android.os.looper.loop(looper.java:135)         @ android.app.activitythread.main(activitythread.java:5257)         @ java.lang.reflect.method.invoke(native method)         @ java.lang.reflect.method.invoke(method.java:372)         @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:903)         @ com.android.internal.os.zygoteinit.main(zygoteinit.java:698) 

here activty.class:

package com.bkane56.practice.practiceapp;  import android.app.activity; import android.database.cursor; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.widget.listview;   public class navigateactivity extends activity {      private metrolinkdatabasehelper myhelper =             metrolinkdatabasehelper.getinstance(this);      @override     protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.activity_navigate);          populatelocationlist();      }      private void opendb() {          myhelper.open();     }      private void closedb() {         myhelper.close();     }      public void populatelocationlist( ) {           cursor cursor = myhelper.getalllcations();         listview lvitems = (listview) findviewbyid(r.id.lvlocations);         locationcursoradaptor locationadaptor = new locationcursoradaptor(this, cursor);         lvitems.setadapter(locationadaptor);          cursor.close();     }  //    ....menu methods left out of question present in class. } 

my helper.class follows:

package com.bkane56.practice.practiceapp;  import android.content.context; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteexception; import android.database.sqlite.sqliteopenhelper;  import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.util.arraylist; import java.util.list;   public class metrolinkdatabasehelper extends sqliteopenhelper {      private context mycontext;     private string stopname;     private string sqlquerytimes;     private static metrolinkdatabasehelper myinstance;      private static string db_path = "data/data/com.bkane56.practice.practiceapp/databases/";     private static string db_name = "metrolink2.db";     public static sqlitedatabase mydatabase;      public static synchronized metrolinkdatabasehelper getinstance(context context) {  //        using singleton minmize chance of opening multiple //        decreasing chance of memory leak         if(myinstance == null) {             myinstance = new metrolinkdatabasehelper(context);         }         return myinstance;     }       private metrolinkdatabasehelper(context context) {         super(context, db_name, null, 1);         this.mycontext = context;         boolean dbexist = checkdatabase();         if (dbexist) {         } else {             system.out.println("database doesn't exist");             try {                 createdatabase();             } catch (ioexception e) {                 // todo auto-generated catch block                 e.printstacktrace();             }         }     }      //      create (copy original in assets) if not exist using copydatabase     public void createdatabase() throws ioexception {         boolean dbexist = checkdatabase();         if (dbexist) {         } else {             this.getreadabledatabase();             try {                 copydatabase();             } catch (ioexception e) {                 throw new error("error copying database");             }         }     }      //     check if android database has been created attached database     private boolean checkdatabase() {         boolean checkdb = false;         try {             string mypath = db_path + db_name;             file dbfile = new file(mypath);             checkdb = dbfile.exists();             if (!checkdb) {                 system.out.println("the data base not exist");             }         } catch (sqliteexception e) {             system.out.println("database doesn't exist");         }          return checkdb;     }      //    copies data metrolink db in assets data/data....metrolink.db     public void copydatabase() throws ioexception {          // open local db input stream         inputstream myinput = mycontext.getassets().open(db_name);         string outfilename = db_path + db_name;          // open empty db output stream         outputstream myoutput = new fileoutputstream(outfilename);          // buffered reader write new database         byte[] buffer = new byte[1024];         int length;         while ((length = myinput.read(buffer)) > 0) {             myoutput.write(buffer, 0, length);         }         // close streams         myoutput.flush();         myoutput.close();         myinput.close();     }      public static sqlitedatabase open() {         // open database         string mypath = db_path + db_name;         mydatabase = sqlitedatabase.opendatabase(mypath, null,                 sqlitedatabase.open_readonly);         return mydatabase;     }      public synchronized void close() {         super.close();         mydatabase.close();      }      public void delete() {         //delete existing database         file mypath = new file(db_path + db_name);         mydatabase.close();         system.out.println("deleting existing database");         mydatabase.deletedatabase(mypath);     }      //    returns list of stops sorted longitude west east     public list<string> getallstops() {          final string table = "stops";         final string[] column = new string[]{"stop_name"};         final string order_by = "stop_name";         string mypath = db_path + db_name;         list<string> stoplist = new arraylist<string>();  //        open data base         open();          cursor c = mydatabase.query(table, column, null, null, null, null, order_by, null); //            cursor c = mydatabase.rawquery("select stop_name _id stops", null);          if (c.movetofirst()) {             {                 stoplist.add(c.getstring(0));             }             while (c.movetonext());             if (c != null && !c.isclosed()) {                 c.close();             }          }         mydatabase.close();         return stoplist;      }  //    returns cursor stop_name, stop_lat, stop_lon, _id metrolink2.db     public cursor getalllcations() {  //        populate list stoplon, list stoplat, list stopname         list<string> stopll = new arraylist<>();         list<list<string>> namelatlong = new arraylist<>();  //        open database         open();          cursor c = mydatabase.rawquery("select stop_name, stop_lat, stop_lon, _id " +                 "from stops", null);         if (c.movetofirst()) {              {                  stopll.add(c.getstring(0));                 stopll.add(c.getstring(1));                 stopll.add(c.getstring(2));                 stopll.add(c.getstring(3));                 namelatlong.add(stopll);                 stopll.clear();             }             while (c.movetonext()); //            if (c != null && !c.isclosed()) { //                c.close(); //           }         }         mydatabase.close();         return c;     }      //    gets next 3 stop times     public list<string> getstoptimes(string sqlquerytimes) {         this.sqlquerytimes = sqlquerytimes;          list<string> stoptime = new arraylist<string>();         string mypath = db_path + db_name;  //        open database         open();          cursor c = mydatabase.rawquery(sqlquerytimes, null);          if (c.movetofirst()) {             {                 stoptime.add(c.getstring(0));             }             while (c.movetonext());             if (c != null && !c.isclosed()) {                 c.close();             }          }         mydatabase.close();         return stoptime;     }      @override     public void oncreate(sqlitedatabase db) {      }      @override     public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {      } } 

and adapter.class this:

package com.bkane56.practice.practiceapp;  import android.content.context; import android.database.cursor; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.cursoradapter; import android.widget.textview;  public class locationcursoradaptor extends cursoradapter {      public locationcursoradaptor(context context, cursor cursor) {         super(context, cursor, 0);     }      // newview method used inflate , return new view     @override     public view newview(context context, cursor cursor, viewgroup parent) {         return layoutinflater.from(context).inflate(r.layout.lv_navigation, parent, false);     }      // binds data db text views in list view     @override     public void bindview(view view, context context, cursor cursor) {          textview tvstopname = (textview) view.findviewbyid(r.id.tvstopname);         textview tvlat = (textview) view.findviewbyid(r.id.tvlatitude);         textview tvlon = (textview) view.findviewbyid(r.id.tvlongitude);          string stopname = cursor.getstring(cursor.getcolumnindexorthrow("stop_name"));         string  stoplat = cursor.getstring(cursor.getcolumnindexorthrow("stop_lat"));         string  stoplon = cursor.getstring(cursor.getcolumnindexorthrow("stop_lon"));         string _id = cursor.getstring(cursor.getcolumnindexorthrow("_id"));          // set textview text cursor         tvstopname.settext(stopname);         tvlat.settext(stoplat);         tvlon.settext(stoplon);     } } 

the getallstops() method , getstoptimes() method work fine. in different activity getalllocations() method.

any appreciated.

if need more info let me know.


Comments