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

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -