好的,这是一个更理论化的问题。
我有PlayerRepository
。这是一个用于在我的SQLite数据库上执行操作的类。我已经实施了select
,insert
,update
等行为。
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
。 不是问题。
但有时我想在活动中使用我的存储库。在某种需要获取数据的工具类中。所以我有两种方式可以考虑
我在活动中获取数据并将其传递给我的工具类/方法,因此我不需要在其中使用存储库。这不是很灵活
我需要将上下文传递给我的工具类/方法。但这意味着每种操作都需要接收上下文,我不确定这是一种好方法
我错过了什么吗?有没有更好的方法来处理它?</ p>
答案 0 :(得分:0)
我知道这是一个古老的问题,但我仍然会为那些将来会通过这个问题的人写信。
为了摆脱用于访问数据库的存储库模式的上下文问题,您可以在项目中实现DI(依赖注入)模式。有很多理由这样做,而这个问题说明了其中之一。
如果您实施DI,您将在整个模块(或应用程序)中拥有仅一个数据库存储库实例。此实例将在具有上下文的类中创建,并在需要时注入到这些类。 使用DI的最简单方法之一是使用Dagger 2库。您可以在他们的网站上找到所有相关信息。