2013-07-03 47 views
1

在我的應用程序中,我爲一個數據庫實現了多個內容提供者,每個表有一個數據庫,因爲有很多表並且具有所有邏輯他們在一個單一的內容提供商將是相當混亂。當單個數據庫有多個內容提供者時尋址SQLiteOpenHelper的多個實例

我跟着這個鏈接通過廝磨給出的建議是:

Content provider for multiple tables

因此,有具有SQLiteOpenHelper成員變量抽象AbsShopContentProvider。這個抽象的內容提供者然後被多個內容提供者擴展,如Table1Provider,Table2Provider,...

所以現在我有一個每個內容提供者的SQLiteOpenHelper實例。這是否會造成關於線程安全的任何問題?

在我的抽象Content Provider中將此SQLiteOpenhelper變量設置爲「static」並僅在抽象提供程序的onCreate()中創建它的實例(僅當它爲null時)是個好主意嗎?它會解決有很多DB輔助對象的問題嗎?

+0

將SQLiteOpenhelper做成一個懶惰的單例是一個好主意。 –

+0

它會創建問題,如果你的數據庫連接是打開的,你會嘗試再次打開onnection它會拋出異常 – farrukh

+0

okie ..但我認爲內容提供商將解決連接問題...雖然我還沒有嘗試過它是我自己!感謝這兩個答案....我現在將刪除靜態,而是實現我的SQLiteOpenHelper作爲一個單身......所以,當多個內容提供商訪問它,只有一個實例可用.. – shanti

回答

2

所有你需要的是確保你共享一個SQLiteDatabase的實例,SQLite會自動處理同一個數據庫的鎖定。

爲了使數據庫全局可用,擴展應用類:

public class App extends Application { 
    private static SQLiteDatabase db; 

    public static SQLiteDatabase getDb() { 
     return db; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     db = new MySQLiteOpenHelper(getApplicationContext()).getWritableDatabase(); 
    } 
} 

,並把它添加到表現:

<application 
    android:name=".App" 

現在,你可以從任何活動/片段/服務通過訪問數據庫調用App.getDb()

+0

好吧,我已經實現了多個內容提供者引用一個單例SQLiteOpenHelper(也就是擴展它的類)。它目前適用於我,儘管我的方式是更長的方法。 - 我只是想問一下你之前答案中的「懶惰」部分。此外,您在App中創建靜態數據庫變量的方法更簡單。那麼,在我原來的文章中,我通過在我的Base ContentProvider中創建了一個自定義SQLiteOpenHelper的靜態實例,類似的方式進行了其他內容提供者的擴展。所以這也解決了這個問題。 – shanti

+0

@ user2557600當第一次調用getInstance()時,一個懶惰單例創建它的靜態實例變量。另外,'Application'類是首先創建的,並在任何android應用程序中最後銷燬。所以,它的'onCreate()'將在其他任何運行之前運行。另一個優點是可以從外部任何地方簡單地靜態調用App.getDb()。 –

+0

是......的確如此。:) – shanti

相關問題