Android数据库单例SQLiteOpenHelper

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

猜你喜欢

转载自blog.csdn.net/lllx9464/article/details/79355808