在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; } }