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

标签 java android database mvp

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

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

AppDatabase 是一个抽象类,它扩展了 RoomDatabase,有一堆 android 导入并包含一个 DAO界面。此设计来自Android官方指南。

现在,如果我传递并使用该 AppDatabase 对象(或 DAO 接口(interface),因为它实际上包含数据库操作方法),它会破坏 MVP 模式吗?在演示者中? DAO 包含 SQL 查询并具有大量 Android 导入,以及诸如 dao.insert(item) 之类的方法。

编辑:

AppDatabase 类和 ItemDao 接口(interface):

@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);
}

最佳答案

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

我还建议将 AppDatabase 类文件添加到您的帖子中,以使其更加明确。

编辑

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

关于java - 如何在不打破MVP模式的情况下使用Room?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61351086/

相关文章:

java - Android 数据绑定(bind)错误示例

android - 同一应用中的 ons-split-view 和 ons-sliding-menu

android - 可以在 android studio 中自动填充代码语句

mysql - 我可以获得 MySQL 的负载百分比或预计执行时间吗?

java - 您将如何永久运行 java 程序而不必让您的个人计算机一直运行?

java - 为什么我的程序在使用foreach循环迭代ArrayList时显示这种类型的错误?

java - 如何解决lint warning "field is never used"but it is serialized

java - 什么是java中的@override注解?

android - 同一 Activity 上的两个抽屉导航

java - 如何用JPQL编写查询?