在SQLiteOpenHelper的不同实例中使用相同的SQLiteDatabase实例

时间:2012-11-28 14:09:01

标签: android multithreading sqlite singleton sqliteopenhelper

我的应用程序中需要多个表。为此,我创建了SQLiteOpenHelper的单独子类来插入/删除/更新不同表的数据。我的问题是如何确保所有这些子类在整个代码中使用相同的SQLiteDatabase实例。虽然我已经使每个子类成为单例。但是,我无法解决在整个代码中使用通用SQLiteDatabase实例的问题。

PS :我不想使用ContentPovider或创建单个SQLiteOpenHelper子类,因为这会使我的代码复杂化。

2 个答案:

答案 0 :(得分:1)

只要你在整个(每个数据库)使用相同的SQLiteOpenHelper就可以了。它会自动确保getWriteableDatabase和getReadableDatabase只访问一个缓存的数据库。

答案 1 :(得分:0)

我真的没有看到你在使用普通SQLiteOpenHelper时遇到的困难。你只需复制你为一张桌子做的事情!创建一个扩展SQLiteOpenHelper并执行复制的自定义类。

public class SQLiteCustomBase extends SQLiteOpenHelper {

    private static final String CREATE_BDD_1 = "CREATE TABLE ...";
    private static final String CREATE_BDD_2 = "CREATE TABLE ...";

    public SQLiteCustomBase(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BDD_1);
        db.execSQL(CREATE_BDD_2);
    }

    @Override
    public void onOpen(SQLiteDatabase db) {}

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE " + Vars.TABLE_1 + ";");
        db.execSQL("DROP TABLE " + Vars.TABLE_2 + ";");
        onCreate(db);
    }
}

然后在执行某些数据库操作的类中:

public class HandlerClass {
    private SQLiteDatabase db;
    private SQLiteCustomBase customBase;

    public HandlerClass(Context context){
        customBase = new SQLiteCustomBase(context, Vars.NAME_DB, null, Vars.VERSION_DB);
    }

    public void open(){
        db = customBase.getWritableDatabase();
    }

    public void openForRead(){
        db = customBase.getReadableDatabase();
    }

    public void close(){
        db.close();
    }

    public SQLiteDatabase getDB(){
        return db;
    }
}

void myMethods()
{
    bdd.insert(Vars.TABLE_1, null, values);
    bdd.insert(Vars.TABLE_2, null, values);
}
etc.