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

Java 如何在使用数据库存储库的方法之间正确传递上下文?,java,android,sqlite,architecture,software-design,Java,Android,Sqlite,Architecture,Software Design,好的,这是一个理论性的问题 我有PlayerRepository。这是一个用于对我的SQLite数据库执行操作的类。我已经实现了像选择,插入,更新等操作 public PlayerRepository(Context context) { super(context, com.fixus.portals.model.Player.class); open(); } 构造函数中的super是因为PlayerRepository扩展了存储库,它也是我的类。存储库中最重要的部分就是这

好的,这是一个理论性的问题

我有
PlayerRepository
。这是一个用于对我的SQLite数据库执行操作的类。我已经实现了像
选择
插入
更新
等操作

public PlayerRepository(Context context) {
    super(context, com.fixus.portals.model.Player.class);
    open();
}
构造函数中的
super
是因为
PlayerRepository扩展了存储库
,它也是我的类。
存储库
中最重要的部分就是这个

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();
    }
}
}
公共类存储库{
受保护的静态SQLiteDatabase db=null;
受保护的静态MainHelper=null;
受保护的语境;
私人阶级类型;
公共存储库(上下文,类Z){
this.type=classz;
this.context=上下文;
if(helper==null){
helper=新的MainHelper(context.getApplicationContext());
} 
}
公共静态void open(){
if(db==null){
db=helper.getWritableDatabase();
}
}
}
正如您所看到的,当我创建存储库时,如果数据库以前没有打开,我将打开它。为此,我需要传递应用程序/活动的
上下文。这不是问题

但有时我想在活动之外使用我的存储库。在某种需要获取数据的工具类中。所以我有两种方法可以考虑

  • 我在活动中获取数据并将其传递给我的工具类/方法,因此我不需要在其中使用存储库。这不是很灵活

  • 我需要将上下文传递给我的工具类/方法。但这意味着每种操作都需要接收上下文,我不确定这是一种好方法


  • 我错过什么了吗?有没有更好的方法来处理它?

    您总是需要一个上下文来访问SQLite数据库,因此您可以做的是更改特定工具类的构造函数,并将PlayerRepository的新实例作为参数传递。这可以防止工具类本身需要上下文

    在我看来,如果你有多个使用数据库的类,最好的方法是创建一个新类,它唯一的工作就是执行数据库操作,并将所有需要的操作放在这个类中

    只需使用工具和PlayerRepository构造函数当前活动的上下文创建此数据库类的对象。这样一来,PlayerRepository或Tools类都不需要上下文,它们都可以对数据库执行操作。
    即使您真的需要PlayerRepository中的上下文,也最好将所有与数据库相关的函数集中在一个类中。

    我知道这是一个老问题,但我还是会为像我这样的将来会遇到这个问题的人写信

    为了消除用于访问数据库的存储库模式的上下文问题,您可以在项目中实现DI(依赖项注入)模式。这样做有很多原因,这个问题就是其中之一

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

    因此,我应该创建一个类来建立数据库连接,并将其作为参数传递给repository and tools类,而不是将上下文传递给repository以在解决方案中创建数据库连接。我完全理解你了吗?是的。这样,您就可以将insert和get查询放在数据库类中,只需调用
    myDatabase.myFunction()
    Repository就是一个数据库类。每个模型的每个存储库。在我看来,创建一个大型数据库并不是一个好主意。但当我将存储库和数据库类结合起来,打开/关闭数据库,并使这个对象成为整个应用程序的全局对象时,我可以编写独立的类和工具。这是一个好办法