android - SQLiteOpenHelper synchronization -


so i've come idea , i'm wondering if realizable.

let's i've multiple tables(database models) each of them represented class.i don't wont use singleton pattern open helper i've created simple class provide single instance of database.my idea long tables hold reference sqlitedatabase(returned open helper) work same db instance , won't needed synchronized work database since open helper this.when last table finish it's work gc collect open helper (since last reference weak reference) -> finalize() called , close db during method prevent warning os. question is: work?will close automatically db , leak or throw exception?

here class:

public class databasehelper {  private static weakreference<somecustomopenhelper> sdbopenhelper;  private void notifydbcreate(sqlitedatabase db) {     (dbtable table : mtables) {         table.ondbcreate(db);     } }  private void notifydbupgrade(sqlitedatabase db) {     (dbtable table : mtables) {         table.ondbupgrade(db);     } }  public sqlitedatabase getdatabase(boolean readonly) {     somecustomopenhelper dbhelper = sdbopenhelper.get();     if (dbhelper == null) {         dbhelper = new somecustomopenhelper(context, name, factory, version, new databaseeventscallback());         sdbopenhelper = new weakreference<somecustomopenhelper>(dbhelper);     }     if (readonly) {         return dbhelper.getreadabledatabase();     } else {         return dbhelper.getwritabledatabase();     } }  private class databaseeventscallback implements idatabaseeventscallback {      @override     public void oncreate(sqlitedatabase db) {         notifydbcreate(db);     }      @override     public void onupgrade(sqlitedatabase db) {          notifydbupgrade(db);     }  }  interface idatabaseeventscallback {     void oncreate(sqlitedatabase db);      void onupgrade(sqlitedatabase db); }  private static class somecustomopenhelper extends sqliteopenhelper {      private idatabaseeventscallback mcb;      public somecustomopenhelper(context context, string name, cursorfactory factory, int version, idatabaseeventscallback cb) {         super(context, name, factory, version);          mcb = cb;     }      @override     public void oncreate(sqlitedatabase db) {         mcb.oncreate(db);     }      @override     public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {         mcb.onupgrade(db);     }      @override     protected void finalize() throws throwable {         this.close();         super.finalize();     } } } 

did not know answer neither, got interested , looked up.

the answer written out here; http://blog.foxxtrot.net/2009/01/a-sqliteopenhelper-is-not-a-sqlitetablehelper.html

but core of info is;

i created 3 sqliteopenhelper classes, 1 each table, though referenced single database file.

here fell apart. android maintains versions databases based on package it’s associated with, name of database, , version number provide. package , name go decided path on device be, while version stored (somewhere) on device knows when needs call openhelper’s onupgrade event handler. turns out if, in sqliteopenhelper constructor, determines database exists, won’t call oncreate or onupgrade methods @ all, if particular class making call has never been called before.


Comments