如何在不打破 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)
.
编辑:
AppDatabase
class和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 仅依赖于它使用的实体并使实体成为完全自由的元素。
我在我的应用程序中使用 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)
.
编辑:
AppDatabase
class和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 仅依赖于它使用的实体并使实体成为完全自由的元素。