2012-11-28 230 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並回調給每一個 –

相關問題