【发布时间】:2018-06-08 02:08:34
【问题描述】:
我正在尝试将简洁架构方法应用于我的项目 (Link: guide I'm currently referencing)。
我正在使用 Room 数据库进行本地存储,我希望它成为应用程序中的单一数据源 - 这意味着首先从网络调用收集的所有数据都保存在数据库中,然后才传递给演示者。 Room 从它的 DAO 中提供 LiveData 的返回,这正是我需要的。
但是,我也想使用存储库作为访问数据的单一方式。下面是一个领域层(最抽象的)存储库接口的例子:
interface Repository<T>{
fun findByUsername(username: String) : List<T>
fun add(entity: T): Long
fun remove(entity: T)
fun update(entity: T) : Int
}
在这里我遇到了问题 - 我需要从 ViewModel 中的 Room 的 DAO 获取 LiveData,我想使用 Repository 实现来获取它。但为了实现这一点,我需要:
- 更改存储库方法 findByUsername 以返回 LiveData>
- 或者直接从 ViewModel 调用 Room 的 DAO,完全跳过存储库实现
这两个选项都有足够的缺点:
- 如果我将
android.arch.lifecycle.LiveData导入到我的存储库接口中,它会破坏域层中的抽象,因为它现在依赖于 android 架构库。 - 如果我直接在 ViewModel 中将 Room 的 DAO 称为
val entities: LiveData<List<Entity>> = database.entityDao.findByUsername(username),那么我将打破所有数据访问必须使用 Reposiotry 进行的规则,我将需要创建一些样板代码以进行同步带远程存储等。
如何使用 LiveData、Room 的 DAO 和 Clean 架构模式实现单一数据源方法?
【问题讨论】:
-
大部分答案都很复杂而且矫枉过正。只需查看 google 示例中的 this elegance 即可。该函数返回
LiveData但由于 kotlin 的语言特性,您不必导入它。好好研究一下那个 repo。它可能会解决你的大部分问题
标签: android kotlin android-room clean-architecture android-livedata