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



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

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

AppDatabase是一个抽象类,它扩展了RoomDatabase,具有一组android导入,并包含一个DAO接口。这个设计来自Android的官方指南。

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

编辑:

AppDatabase类和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);
}

不,只要依赖关系从视图(活动或片段(转移到演示者,就不会破坏MVP结构。公开DAO而不是应用程序数据库是个好主意。

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

编辑

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

相关内容

最新更新