2015-08-15 38 views
2

好吧,這是一個更理論的問題。我有PlayerRepository。這是一個用於在我的SQLite數據庫上進行操作的類。我實現了有操作,如selectinsertupdate如何正確傳遞方法之間的上下文以使用數據庫存儲庫?

public PlayerRepository(Context context) { 
    super(context, com.fixus.portals.model.Player.class); 
    open(); 
} 

super在構造函數的原因PlayerRepository extends Repository這也是我的課。的Repository最重要的部分是這樣的一個

public class Repository<T> { 
protected static SQLiteDatabase db = null; 
protected static MainHelper helper = null; 
protected Context context; 
private Class<T> type; 

public Repository(Context context, Class<T> classz) { 
    this.type = classz; 
    this.context = context; 
    if(helper == null) { 
     helper = new MainHelper(context.getApplicationContext()); 
    } 
} 

public static void open() { 
    if(db == null) { 
     db = helper.getWritableDatabase(); 
    } 
} 
} 

正如你可以看到,當我創建我打開數據庫,如果沒有之前打開庫。爲此,我需要通過應用程序/活動的Context。那不是問題

但有時我想用我的存儲庫在一個活動的一面。在某種需要獲取數據的工具類中。所以,我有,我可以考慮一下

  1. 我得到的活動數據,並將其傳遞給我的工具類/方法,所以我不需要它使用存儲庫兩種方式。這不是很靈活

  2. 我需要將上下文傳遞給我的工具類/方法。但這意味着每一種手術都需要接受上下文,我不確定這是一種好方法

我是否錯過了什麼?有沒有更好的方法來處理它?

回答

2

你總是需要一個Context來訪問SQLite數據庫,所以你可以做的是改變該特定工具類的構造函數,並傳遞一個PlayerRepository的新實例作爲參數。這可以防止你的工具類需要一個上下文本身。

Imo如果你有多個類,使用數據庫最好的方法是創建一個新的類,其唯一的工作是做數據庫操作並將所有需要的操作放在那個類中。

只需創建與當前活動的背景下,這個數據庫類的目的是工具PlayerRepository構造。這種方式既不是你的PlayerRepository工具類需要上下文,都可以對數據庫作出行動。 即使你真的需要上下文PlayerRepository最好將所有數據庫相關的功能集中在一個類中。

+0

因此,而不是將上下文傳遞到存儲庫以在您的解決方案中創建數據庫連接我應該創建一個類,該類將建立數據庫連接並將其作爲參數傳遞給存儲庫和工具類。我真正理解你嗎? – Fixus

+0

是的。這樣,你把你的插入和獲取查詢的數據庫類,只是調用'myDatabase.myFunction()' – ThomasS

+0

存儲庫是一個數據庫類。每個模型的每個存儲庫。製作一個大型數據庫是不是一個好主意IMO。但是當我將庫與數據庫類結合在一起時,數據庫類將打開/關閉數據庫,並使該對象成爲整個應用程序的全局對象,這樣我就可以編寫獨立的類和工具。這是一個很好的方法 – Fixus

0

我明白這是一個古老的問題,但我仍然會爲像我這樣的將來會通過這樣的人寫信。

爲了擺脫用於訪問數據庫的存儲庫模式的上下文問題,您可以在項目中實現DI(依賴注入)模式。這樣做有很多原因,這個問題說明了其中之一。

如果您實施DI,您將在整個模塊(或應用程序)中擁有一個數據庫存儲庫實例。這個實例將創建在具有上下文的類中,並在需要時注入到這些類中。 使用DI最簡單的方法之一是使用Dagger 2庫。您可以在其網站上找到的所有相關信息。

相關問題