如何在不打破 MVP 模式的情况下使用 Room?

How to use Room without breaking the MVP pattern?

我在我的应用程序中使用 Room 数据库并且我试图遵循 MVP 模式,所以我想使用演示者来调用执行数据库操作的函数。需要一个 android 应用程序上下文来获取数据库引用,因此在视图 (Activity) 中我调用:

AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "AppDatabase").build();

AppDatabase 是一个扩展 RoomDatabase 的抽象 class,有一堆 android 导入并包含一个 DAO 接口。此设计来自Android的官方指南

现在,如果我在演示者中传递并使用那个 AppDatabase 对象(或 DAO 接口,因为它实际上包含数据库操作方法),它会破坏 MVP 模式吗? DAO 包含 SQL 查询,并有一堆 android 导入,方法如 dao.insert(item).

编辑:

AppDatabaseclass和ItemDao接口:

@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract ItemDao itemDao();
}

@Dao
public interface ItemDao {
    @Query("SELECT * FROM item")
    List<Item> getAll();

    @Query("SELECT * FROM item WHERE date BETWEEN :from AND :to")
    List<Item> findItemsBetweenDates(LocalDate from, LocalDate to);

    @Insert
    void insert(Item... items);
}

不,只要依赖项从视图(Activity 或片段)传输到演示者,您就不会破坏 MVP 结构。公开您的 DAO 而不是应用程序数据库是个好主意。

我还建议将 AppDatabase class 文件添加到您的 post 以使其更明确。

编辑

创建 Repository 接口而不是公开 DAO,它从调用元素(可以是 PRESENTER、CONTROLLER 或 VIEWMODEL,无论您喜欢什么)中抽象出 DAO 和存储库的实现本身。这将使存储库仅依赖于 DAO 的 public API 而不是其实现,使 DAO 仅依赖于它使用的实体并使实体成为完全自由的元素。