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
Post a Comment