实现 BaseDao 的多个 Daos 的存储库类委托 - 可能吗?
Posted
技术标签:
【中文标题】实现 BaseDao 的多个 Daos 的存储库类委托 - 可能吗?【英文标题】:Repository Class Delegation to Multiple Daos that implement BaseDao - Possible? 【发布时间】:2019-10-12 05:48:49 【问题描述】:我的 android 应用程序有一个 Room 数据库。我的 FooDao 和 BarDao 都实现了 BaseDao:
interface BaseDao<T>
@Insert
fun insert(obj: T): Long
@Update
fun update(obj: T)
@Dao
interface FooDao: BaseDao<FooEntity>
@Query("some query")
fun doSomethingWithFoo()
@Dao
interface BarDao: BaseDao<BaseEntity>
@Query("some other query")
fun doSomethingWithBar()
我也有一个存储库类:
class MyRepo(private val fooDao: FooDao, private val barDao: BarDao)
fun doSomethingWithFoo() = fooDao.doSomethingWithFoo()
fun doSomethingWithBar() = barDao.doSomethingWithBar()
但想象一下,FooDao、BarDao 和 MyRepo 的功能远不止这两个功能。
我了解了类委托以启用组合继承。因此,我试图通过委托简单的函数来减少 MyRepo 中的样板,这些函数只调用 dao 的函数并返回 dao 的返回值。我应该这样做是有道理的:
class MyRepo(...): FooDao by fooDao, BarDao by barDao
//fun doSomethingWithFoo no longer necessary
//fun doSomethingWithBar no longer necessary
但是,Android Studio 给了我一个红色波浪状的字样 Type parameter T of BaseDao has inconsistent values: FooEntity, BarEntity
这是否意味着减少像MyRepo.doSomethingWithFoo = fooDao.doSomethignWithFoo
这样的样板文件的所有希望都消失了?或者有没有办法做到这一点?
我试图实际覆盖 MyRepo 中的 BaseDao 函数,认为它会停止抱怨 FooEntity 和 BarEntity:
class MyRepo(...): BaseDao<Any>, SetDao by setDao, ...
override fun insert(t: Any): Long = 0L
但这只是在不一致的类型消息中添加“任何”。
【问题讨论】:
【参考方案1】:我遇到了同样的问题,并用注释替换了泛型类。
我们最近发布了我们的库LivingRoom
您只需使用适当的注释(@Insertable、@Deletable、@Updatable、@Selectable ...)标记您的实体类
【讨论】:
以上是关于实现 BaseDao 的多个 Daos 的存储库类委托 - 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章