Android 通过创建对象或使用getwritabledatabase打开数据库连接
我的应用程序有7个活动,它们都高度依赖于数据库,每个活动在被访问时都会大量查询数据库 对于这个问题,我为database类和我调用下面语句的每个操作创建了一个singleton数据库对象Android 通过创建对象或使用getwritabledatabase打开数据库连接,android,android-sqlite,Android,Android Sqlite,我的应用程序有7个活动,它们都高度依赖于数据库,每个活动在被访问时都会大量查询数据库 对于这个问题,我为database类和我调用下面语句的每个操作创建了一个singleton数据库对象 Database.getInstance(c1).getWritableDatabase() 对于插入、选择和删除,我使用的方法如下 -- insert Database.getInstance(c1).getWritableDatabase().insert -- select Database.getIn
Database.getInstance(c1).getWritableDatabase()
对于插入、选择和删除,我使用的方法如下
-- insert Database.getInstance(c1).getWritableDatabase().insert
-- select Database.getInstance(c1).getWritableDatabase().rawquery
-- delete Database.getInstance(c1).getWritableDatabase().rawquery
我使用这种方式是因为通过这种方式,整个应用程序中只使用一个对象,而不会创建多个对象
但在搜索web时,我了解到getWritableDatabase()将打开到数据库的连接。现在我搞不清楚是数据库对象类会打开连接,还是调用getwritabledatabase会打开连接
我很担心,因为我觉得我在不知不觉中建立了太多的联系
编辑
我尝试在每个活动中创建一个可写数据库对象,如下所示,并在该活动中使用该对象,但它返回了数据库锁定异常,因此我被迫对每个db操作使用数据库.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);++
}
}
我相信class
Database
是SQLiteOpenHelper
的包装器,对吗?因为您有一个单例,所以每次调用getWritableDatabase()
时,它都在利用现有连接。新连接仅在第一次调用时被调用。例如,您可以在onResume
或onCreate
打开新连接,然后在onestory
或onPause
关闭它
从getWritableDatabase()
上的文档:
一旦成功打开,数据库将被缓存,因此您可以在每次需要写入数据库时调用此方法您应该具有打开数据库的函数、关闭数据库的函数和其他查询函数。考虑下面的类:
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()
,在第一次关闭它或实例化该类之前,不必再次打开它
然后可以根据需要使用“插入”或“选择”
希望这有帮助谢谢@nikis的回复。。。但我的疑问就在这里,因为我无法为一个活动创建一个GetWritable数据库。。我被迫使用
数据库.getInstance(c1).getWritableDatabase()代码>用于所有数据库操作。。我想知道这是否会创建n个连接。请帮助我understand@Siva不,不会的。你每次打电话都会使用相同的cahced连接这对我来说是一个很好的信息。。。还有一个问题,在这种情况下,我应该在哪里关闭连接?我计划在每次语句数据库操作后关闭。这是正确的方法吗?如果没有,请使用正确的方法进行指导。@Siva不是从多个线程使用DB的最佳方法,因此取决于应用程序的逻辑感谢@nikis的帮助谢谢@Sujan,但我这里的问题是我有7个活动,所有7个都需要开放的数据库连接,在这种情况下,当我7次使用opendatabase对象时,它给了我数据库锁定
异常,因此我创建了singleton。我的疑问是,当我使用singleton实例时,我的连接被打开了,或者当我调用getwritabledatabase
时,我的连接被打开了?根据文档,当getwritabledatabase()时被称为。如果最近未打开数据库,则将创建该数据库的新实例。如果数据库已经打开,当我们调用getWritableDatabase()时,它将尝试返回缓存的对象。因此,我认为该连接是重复使用的,而不是创建新的连接。谢谢@Sujan的回复