2012-11-28 189 views
2

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

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

回答

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. 
+1

谢谢。我还使'SQLiteCustomBase'类成为单例,以便所有HandlerClass在整个应用程序中使用同一个'SQLiteDatabase'实例。这可以避免同时执行过程中的任何崩溃! – gauravsapiens

1

只要你使用相同的SQLiteOpenHelper(每个数据库),你会没事的。它会自动确保getWriteableDatabase和getReadableDatabase只访问一个缓存数据库。

+0

的问题是我有多个表。因此,我使用SQLiteOpenHelper的多个实例来降低复杂性。你有更好的方法吗? – gauravsapiens

+3

是的。如果你使用多个表,但它们都在同一个数据库中,你应该只使用一个SQLiteOpenHelper。否则,您将面临一些写入失败的风险。最简单的方法就是使用帮助器来处理那个数据库。 – yydl

+0

同意。这里的问题是SQLiteOpenHelper玩具示例通常会在脏代码中派生出来,当您需要多个表并且有外键等时。助手需要知道用于创建和升级数据库的表名和行名。这种耦合太多了,通常会出现类顶部常量的恶梦。如果你想以一种干净且可维护的方式使用helper,使用'onCreate(SQLiteDatabase db)'和'onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)'方法创建一个DAO接口。然后在助手中注入你的DAO并回调给每一个 –

相关问题