如何正确传递方法之间的上下文来使用数据库存储库?

时间:2015-08-15 15:29:03

标签: java android sqlite architecture software-design

好的,这是一个更理论化的问题。

我有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. 我需要将上下文传递给我的工具类/方法。但这意味着每种操作都需要接收上下文,我不确定这是一种好方法

  3. 我错过了什么吗?有没有更好的方法来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

我知道这是一个古老的问题,但我仍然会为那些将来会通过这个问题的人写信。

为了摆脱用于访问数据库的存储库模式的上下文问题,您可以在项目中实现DI(依赖注入)模式。有很多理由这样做,而这个问题说明了其中之一。

如果您实施DI,您将在整个模块(或应用程序)中拥有仅一个数据库存储库实例。此实例将在具有上下文的类中创建,并在需要时注入到这些类。 使用DI的最简单方法之一是使用Dagger 2库。您可以在他们的网站上找到所有相关信息。