2014-03-24 54 views
0

我的应用程序有7个活动,并且所有这些活动都高度依赖于数据库,访问时每个活动都会查询数据库。通过创建对象或使用getwritabledatabase打开数据库连接

对于这个问题,我为数据库类和我在下面的语句中调用的每个操作创建了一个单例数据库对象。

Database.getInstance(c1).getWritableDatabase() 

用于插入,选择和删除我使用类似下面

-- insert Database.getInstance(c1).getWritableDatabase().insert 
-- select Database.getInstance(c1).getWritableDatabase().rawquery 
-- delete Database.getInstance(c1).getWritableDatabase().rawquery 

我使用这种方式,因为通过此只有一个对象在整个申请中使用并且将不会创建多个对象。

但谷歌上搜索,当我研究了getWritableDatabase()将打开数据库的连接,我现在很困惑对象数据库类是否会打开一个连接或调用getwritabledatabase将打开一个连接。

我很担心,因为我觉得我在不知不觉中创造了许多关系。

编辑--------------------------------------------- ------------------------------

我已经尝试在每个活动中创建一个可写数据库对象,如下所示:在actovity该对象,但它返回我的数据库锁定例外,所以我被迫使用Database.getInstance(C1).getWritableDatabase()

我有如下创建的每个数据库操作

Sqldatabase sd=Database.getInstance(c1).getWritableDatabase() 

任何人都可以请教我如何打开数据库和应该关闭的位置,以使应用程序稳定并避免内存泄漏。我是Android的新手请让我知道我的设计的使用是有效的或不。

谢谢你的时间。

编辑--------------------------------------------- ------------------------------------ 数据库文件

public class Database extends SQLiteOpenHelper{ 

     private static String dbname="Director"; 
     private static int dbversion=1; 
     SQLiteDatabase db; 
     private Context m1Context; 
     private static Database minstance; 
     public Database(Context context) { 

      super(context, dbname, null, dbversion); 
      // TODO Auto-generated constructor stub 

     } 

     public synchronized static Database getInstance(Context m1Context){ 

      if (minstance==null){ 

      minstance=new Database(m1Context); 
      } 
      return minstance; 


     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      // TODO Auto-generated method stub 

      STable st=new StockTable(m1Context); 
      BTable bt=new BrokerageTable(m1Context); 
      SList sl=new StockList(m1Context); 

      db.execSQL(st.stocktable); 
      db.execSQL(bt.Brokerage); 
      db.execSQL(sl.Create()); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // TODO Auto-generated method stub 

     } 


    } 

类文件:

public class SList { 

    Context c1; 
    Cursor getid; 
    StockList(Context mContext){ 

     c1=mContext; 
    } 

    **//SQLiteDatabase sd=Database.getInstance(c1).getWritableDatabase();** 
    String Ctable; 
    //String ,selectIDgetstocks,deletestock; 
    public String tablename="Stocklist"; 
    public String Column1="_id"; 
    public String Column2="Sname"; 
    ContentValues cv=new ContentValues(); 
    String getstocks="Select " + Column1 + " as _id, " + Column2 + " From "+ tablename; 
    String selectID="Select Max("+ Column1 + ") from " + tablename; 
    public String Create(){ 

     Ctable="Create Table " + tablename + " (" + Column1 + " INTEGER PRIMARY KEY , " + Column2 + " Text" + ")"; 

     return Ctable; 
    } 

    public void insert(int stockid,String name){ 

     cv.put(Column1, stockid); 
     cv.put(Column2, name); 
    ++Database.getInstance(c1).getWritableDatabase().insert(tablename,null,cv);++ 

    } 


} 

回答

1

我相信类Database是包装SQLiteOpenHelper,对吧?既然你有一个单身人士,每次你打电话getWritableDatabase()它都利用现有的连接。新连接仅在第一次通话时被呼叫。例如,您可以在onResumeonCreate处打开新连接,并在onDestroy或处关闭它。

从文档上getWritableDatabase()

一旦成功打开,数据库高速缓存,这样你就可以调用这个方法每次需要写入数据库的时间

+0

感谢@nikis您的回复...但我的疑问是这里我不能创建一个活性的单一getwritabledatabase ..我被迫使用'Database.getInstance(C1 ).getWritableDatabase();'为所有数据库操作saperately ..我想知道这是否会创建n个连接..请帮我理解 – Siva

+0

@Siva nope,它不会。每次打电话都会使用相同的cahced连接 – nikis

+0

感谢这对我来说是一个很好的信息......在这种情况下,我应该关闭连接的另一个问题是什么?我打算在每个语句数据库操作后关闭。这是一个正确的方法吗?如果不是,请用正确的方法引导。 – Siva

2

你应该有一个函数打开数据库,关闭数据库的功能以及其他功能进行查询。考虑以下类:

public void openDatabase(){ 
database = Database.getInstance(c1).getWritableDatabase(); 
} 

public void closeDatabase(){ 
database.close() 
} 

public void insert(){ 
//your insertion code here using database object 
} 

public String select(){ 
//your selection code here using database object 
} 

使数据库类变量。这样,您可以先拨打openDatabase(),再也不必打开,直到您关闭它或第一次实例化课程。

然后,您可以使用插入或按需要选择。

希望这有助于

+0

谢谢@ Sujan但我的问题在这里是我有7个活动,所有7需要一个开放的数据库连接,在这种情况下,当我使用opendatabase对象7次它给了我'数据库锁定的异常,所以我创建单身我怀疑是当我使用单例实例我的连接打开或当我打电话'getwritabledatabase'我的连接打开? – Siva

+0

根据文档,调用getWritableDatabase()时。如果最近尚未打开数据库,则会创建一个新的数据库实例。如果数据库已经打开,当我们调用getWritableDatabase()时,它会尝试返回缓存的对象。所以,我认为连接被重用,而不是创建新连接。 –

+0

谢谢@Sujan的回复 – Siva