我的应用程序有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);++
}
}
感谢@nikis您的回复...但我的疑问是这里我不能创建一个活性的单一getwritabledatabase ..我被迫使用'Database.getInstance(C1 ).getWritableDatabase();'为所有数据库操作saperately ..我想知道这是否会创建n个连接..请帮我理解 – Siva
@Siva nope,它不会。每次打电话都会使用相同的cahced连接 – nikis
感谢这对我来说是一个很好的信息......在这种情况下,我应该关闭连接的另一个问题是什么?我打算在每个语句数据库操作后关闭。这是一个正确的方法吗?如果不是,请用正确的方法引导。 – Siva