【问题标题】:how to properly pass context between methods to use database repository?如何在方法之间正确传递上下文以使用数据库存储库?
【发布时间】:2015-11-08 15:55:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: java android sqlite architecture software-design


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      如果你有多个使用数据库的类,最好的方法是创建一个新类,其唯一的工作是执行数据库操作,并将所有需要的操作放入该类中。

      只需使用 ToolsPlayerRepository 构造函数的当前活动的上下文创建此数据库类的对象。这样,您的 PlayerRepositoryTools 类都不需要 Context 并且两者都可以对数据库进行操作。 即使您确实需要 PlayerRepository 中的 Context,最好将所有与数据库相关的函数集中在一个类中。

      【讨论】:

      • 因此,与其将上下文传递给存储库以在您的解决方案中创建数据库连接,不如创建一个类来建立数据库连接并将其作为参数传递给存储库和工具类。我对你的理解正确吗?
      • 是的。这样您就可以将插入和获取查询放在数据库类中,然后调用 myDatabase.myFunction()
      • Repository 是一个数据库类。每个模型的每个存储库。制作一个大型数据库类不是一个好主意 IMO。但是,当我将存储库与将打开/关闭数据库并使该对象对整个应用程序全局化的数据库类时,我可以编写独立的类和工具。这是一个很好的方法
      猜你喜欢
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 2021-04-06
      • 2019-04-05
      相关资源
      最近更新 更多