java - Error database not open -
hey i'm trying insert data in sqlite database, everytime try insert logcat shows error. error ir shown on service gets calllog data , insert in db.
error:
02-15 17:07:51.658: error/androidruntime(25392): java.lang.illegalstateexception: database not open
and error in line of service class:
db.insert(datahandlerdb.table_name_2, null, values);
here service:
public class theservice extends service { private static final string tag = "theservice"; private static final string log_tag = "theservice"; private handler handler = new handler(); private sqlitedatabase db; class thecontentobserver extends contentobserver { public thecontentobserver(handler h) { super(h); openhelper helper = new openhelper(getapplicationcontext()); sqlitedatabase db = helper.getwritabledatabase(); } @override public boolean deliverselfnotifications() { return true; } @override public void onchange(boolean selfchange) { super.onchange(selfchange); searchinsert(); } } @override public ibinder onbind(intent arg0) { return null; } @override public void oncreate() { db = datahandlerdb.createdb(this); registercontentobservers(); } @override public void ondestroy(){ db.close(); } @override public void onstart(intent intent, int startid) { } private void searchinsert() { cursor cursor = getcontentresolver().query( android.provider.calllog.calls.content_uri, null, null, null, android.provider.calllog.calls.date + " desc "); int numbercolumnid = cursor .getcolumnindex(android.provider.calllog.calls.number); int durationid = cursor .getcolumnindex(android.provider.calllog.calls.duration); int contactnameid = cursor .getcolumnindex(android.provider.calllog.calls.cached_name); int numtypeid = cursor .getcolumnindex(android.provider.calllog.calls.cached_number_type); int calltypeid = cursor .getcolumnindex(android.provider.calllog.calls.type); date dt = new date(); int hours = dt.gethours(); int minutes = dt.getminutes(); int seconds = dt.getseconds(); string currtime = hours + ":" + minutes + ":" + seconds; simpledateformat dateformat = new simpledateformat("m/d/yyyy"); date date = new date(); cursor.movetofirst(); string contactnumber = cursor.getstring(numbercolumnid); string contactname = (null == cursor.getstring(contactnameid) ? "" : cursor.getstring(contactnameid)); string duration = cursor.getstring(durationid); string numtype = cursor.getstring(numtypeid); string calltype = cursor.getstring(calltypeid); contentvalues values = new contentvalues(); values.put("contact_id", 1); values.put("contact_name", contactname); values.put("number_type", numtype); values.put("contact_number", contactnumber); values.put("duration", duration); values.put("date", dateformat.format(date)); values.put("current_time", currtime); values.put("cont", 1); values.put("type", calltype); if (!db.isopen()) { getapplicationcontext().openorcreatedatabase( "/data/data/com.my_app/databases/mydb.db", sqlitedatabase.open_readwrite, null); } db.insert(datahandlerdb.table_name_2, null, values); cursor.close(); } public void registercontentobservers() { this.getapplicationcontext() .getcontentresolver() .registercontentobserver( android.provider.calllog.calls.content_uri, true, new thecontentobserver(handler)); } }
and here datahandlerdb class:
public class datahandlerdb { private static final string database_name = "mydb.db"; private static final int database_version = 1; protected static final string table_name = "table1"; protected static final string table_name_2 = "table2"; protected string tag = "datahandlerdb"; //create db public static sqlitedatabase createdb(context ctx) { openhelper helper = new openhelper(ctx); sqlitedatabase db = helper.getwritabledatabase(); helper.onopen(db); db.close(); return db; } public static class openhelper extends sqliteopenhelper { private final context mcontext; openhelper(context context) { super(context, database_name, null, database_version); this.mcontext = context; } @override public void oncreate(sqlitedatabase db) { string[] sql = mcontext.getstring(r.string.applicationdatabase_oncreate).split("\n"); db.begintransaction(); try{ execmultiplesql(db, sql); db.settransactionsuccessful(); } catch (sqlexception e) { log.e("error creating tables , debug data", e.tostring()); throw e; } { db.endtransaction(); } } private void execmultiplesql(sqlitedatabase db, string[] sql) { for(string s : sql){ if(s.trim().length() > 0){ db.execsql(s); } } } @override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { /*log.w("application database", "upgrading database, drop tables , recreate."); db.execsql("drop table if exists " + table_name); oncreate(db);*/ } @override public void onopen(sqlitedatabase db){ super.onopen(db); } } }
don't want code
if (!db.isopen()) { getapplicationcontext().openorcreatedatabase( "/data/data/com.my_app/databases/mydb.db", sqlitedatabase.open_readwrite, null); }
to be:
if (!db.isopen()) { db = getapplicationcontext().openorcreatedatabase( "/data/data/com.my_app/databases/mydb.db", sqlitedatabase.open_readwrite, null); }
?
also, in function
public thecontentobserver(handler h) { super(h); openhelper helper = new openhelper(getapplicationcontext()); sqlitedatabase db = helper.getwritabledatabase(); }
helper
, db
local variables, not class members. means database open here not used anything, anywhere.
Comments
Post a Comment