database - Android [IllegalArgumentException: the bind value at index 1 is null] for no apparent reason -
i trying methods concerning databases working when referenced 2 different activities causes me re-initialize whole database different contexts in same class. works 1 activity when database closed, initialized , opened in other activity causes illegalargumentexception. makes no sense me didn't change methods connected directly database , working flawlessly when code separated in 2 classes.
stacktrace:
05-09 20:44:42.661: e/androidruntime(953): fatal exception: main 05-09 20:44:42.661: e/androidruntime(953): java.lang.runtimeexception: unable resume activity {maturaarbeit.nicola_pfister.marks/maturaarbeit.nicola_pfister.marks.marks}: java.lang.illegalargumentexception: bind value @ index 1 null 05-09 20:44:42.661: e/androidruntime(953): @ android.app.activitythread.performresumeactivity(activitythread.java:2575) 05-09 20:44:42.661: e/androidruntime(953): @ android.app.activitythread.handleresumeactivity(activitythread.java:2603) 05-09 20:44:42.661: e/androidruntime(953): @ android.app.activitythread.handlelaunchactivity(activitythread.java:2089) 05-09 20:44:42.661: e/androidruntime(953): @ android.app.activitythread.access$600(activitythread.java:130) 05-09 20:44:42.661: e/androidruntime(953): @ android.app.activitythread$h.handlemessage(activitythread.java:1195) 05-09 20:44:42.661: e/androidruntime(953): @ android.os.handler.dispatchmessage(handler.java:99) 05-09 20:44:42.661: e/androidruntime(953): @ android.os.looper.loop(looper.java:137) 05-09 20:44:42.661: e/androidruntime(953): @ android.app.activitythread.main(activitythread.java:4745) 05-09 20:44:42.661: e/androidruntime(953): @ java.lang.reflect.method.invokenative(native method) 05-09 20:44:42.661: e/androidruntime(953): @ java.lang.reflect.method.invoke(method.java:511) 05-09 20:44:42.661: e/androidruntime(953): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:786) 05-09 20:44:42.661: e/androidruntime(953): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:553) 05-09 20:44:42.661: e/androidruntime(953): @ dalvik.system.nativestart.main(native method) 05-09 20:44:42.661: e/androidruntime(953): caused by: java.lang.illegalargumentexception: bind value @ index 1 null 05-09 20:44:42.661: e/androidruntime(953): @ android.database.sqlite.sqliteprogram.bindstring(sqliteprogram.java:164) 05-09 20:44:42.661: e/androidruntime(953): @ android.database.sqlite.sqliteprogram.bindallargsasstrings(sqliteprogram.java:200) 05-09 20:44:42.661: e/androidruntime(953): @ android.database.sqlite.sqlitedirectcursordriver.query(sqlitedirectcursordriver.java:47) 05-09 20:44:42.661: e/androidruntime(953): @ android.database.sqlite.sqlitedatabase.rawquerywithfactory(sqlitedatabase.java:1314) 05-09 20:44:42.661: e/androidruntime(953): @ android.database.sqlite.sqlitedatabase.querywithfactory(sqlitedatabase.java:1161) 05-09 20:44:42.661: e/androidruntime(953): @ android.database.sqlite.sqlitedatabase.query(sqlitedatabase.java:1032) 05-09 20:44:42.661: e/androidruntime(953): @ maturaarbeit.nicola_pfister.marks.database.dbadapter.getaverage(dbadapter.java:200) 05-09 20:44:42.661: e/androidruntime(953): @ maturaarbeit.nicola_pfister.marks.mymenu.getdata(mymenu.java:71) 05-09 20:44:42.661: e/androidruntime(953): @ maturaarbeit.nicola_pfister.marks.marks.onresume(marks.java:52) 05-09 20:44:42.661: e/androidruntime(953): @ android.app.instrumentation.callactivityonresume(instrumentation.java:1184) 05-09 20:44:42.661: e/androidruntime(953): @ android.app.activity.performresume(activity.java:5082) 05-09 20:44:42.661: e/androidruntime(953): @ android.app.activitythread.performresumeactivity(activitythread.java:2565) 05-09 20:44:42.661: e/androidruntime(953): ... 12 more
exception throwing method in marks (menu.onresume):
private final context context; private databasehelper dbhelper; private sqlitedatabase db; mymenu menu = new mymenu(this); listview lview; view view; private string tag = "marks"; @override protected void onresume() { super.onresume(); menu.closedb(); menu.opendb(tag); menu.getdata(lview, view); }
involved methods in mymenu (exception on db.open()):
dbadapter db; public void opendb(string caller) { db = new dbadapter(context); this.caller = caller; //is used distinguish activity called class; not involved in problem db.open(); } public void closedb() { db.clean(); db.close(); } @suppresswarnings("deprecation") public string getdata(final listview lview, final view view) { simplecursoradapter adapter = null; if (caller == "main") { adapter = new simplecursoradapter(context, android.r.layout.simple_list_item_activated_1, db.getallsubjects(), new string[] { "subject" }, new int[] { android.r.id.text1 }); } else if (caller == "marks") { adapter = new simplecursoradapter(context, android.r.layout.simple_list_item_activated_1, db.getmarks(subject), new string[] {"value"}, new int[] { android.r.id.text1 }); cursor cursor = db.getaverage(selection); average = cursor.getdouble(cursor.getcolumnindexorthrow(dbadapter.key_value)); if (average != 0.0) { textview text = new textview(context); text = (textview)view.findviewbyid(r.id.marks_average); text.settext(context.getstring(r.string.average) + " " + average); text.setbackgroundcolor(context.getresources().getcolor(r.color.lightgrey)); } else { textview text = new textview(context); text = (textview)view.findviewbyid(r.id.marks_average); text.settext(""); text.setbackgroundcolor(context.getresources().getcolor(android.r.color.transparent)); } }
involved methods in dbadapter (works fine 1 activity, throws exception on getaverage()):
public dbadapter open() throws sqlexception { db = dbhelper.getwritabledatabase(); return this; } public void close() { dbhelper.close(); } public boolean clean () { db.delete(database_table_subjects, key_subject +"=?", new string[] {""}); db.delete(database_table_marks, key_value + "=?", new string[] {""}); return true; } public cursor getaverage(string subject) throws sqlexception { cursor mcursor = db.query(true, database_table_average, new string[] { key_rowid, key_subject, key_value }, key_subject + "=?", new string[] {subject}, null, null, null, null); if (mcursor != null) { mcursor.movetofirst(); } return mcursor; }
i thought error lies in open() method on reviewing stacktrace found exception thrown getaverage() confuses me because not called @ point. assume there missing correct initialization of dbadapter class in marks activity can't find culprit. if need more information or code solving puzzle don't hesitate let me know. appreciated help!
may see menu.getdata(lview, view)
method?
anyway suggest not return cursor
objects database helper class. why? because, there might multiple calls, maybe parallel calls database. every time need database need open it, , close. if 1 part of application close database, , other part haven't done work yet - , try access data database or try data cursor
object - crash.
my solution make application model <=> database model object map data bi-directional.
for example:
public linkedlist<person> getpersonlist(){ cursor result = db.query(...); linkedlist<person> people = null; if(result.movetofirst()){ people = new linkedlist<person>(); person person = null; do{ person = new person(); person.setbirthdate(result.getint(0)); /*some more attributes mapping*/ people.add(person); }while(result.hasnext()); } return people; }
Comments
Post a Comment