在sqlite中多次打开数据库,对数据库进行高并发操作,容易造成锁表, 对此可以在只打开一次数据库的情况下,对数据库进行多次操作。
新建一个MyDatabaseHelper继承自SQLiteOpenHelper
使用volatile声明一个MyDatabaseHelper对象,通过getDBHelper()方法来获取唯一实例
private volatile static MyDatabaseHelper myDBHelper;
private MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//双重验证的单例方法,通过getDBHelper得到helper对象来得到数据库,保证helper类是单例的
public static MyDatabaseHelper getDBHelper(Context context) {
if (myDBHelper == null) {
synchronized (MyDatabaseHelper.class) {
if (myDBHelper == null) {
myDBHelper = new MyDatabaseHelper(context, "MyWeather.db", null, DBVersion);
}
}
}
return myDBHelper;
}
在需要对数据库操作的类中调用MyDatabaseHelper.getDBHelper(context)方法获取一个唯一的helper,使用这个helper来对数据库进行操作
private SQLiteDatabase db;
...
db = MyDatabaseHelper.getDBHelper(getContext()).getWritableDatabase();
...
db.delete("SavedCity", "cityName = ?", new String[]{cityName});
当然也可以直接在Helper类中直接声明获取数据库的方法
//类中声明private SQLiteDatabase mDB;
public SQLiteDatabase openWriteLink(){
if(mDB == null||!mDB.isOpen()){
mDB = myDBHelper.getWritableDatabase();
}
return mDB;
}
//获取只读的数据库也是同样的写法
同时还要声明关闭数据库的方法
public void closeLink(){
if(mDB != null && mDB.isOpen()){
mDB.close();
mDB = null;
}
}