我有一个 DAO 界面,其中我有多个实现,我希望其中一个是Room实现( Kotlin ):
interface BaseDao {
fun getAll(): Single<List<SomeData>>
fun insert(data: List<SomeData>)
}
和我的房间(RxRoom)界面:
@Dao
interface RxRoomBaseDao: BaseDao {
@Query("SELECT * FROM some_data")
override fun getAll(): Single<List<SomeData>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
override fun insert(data: List<SomeData>)
}
看起来Room编译器试图编译BaseDao
而不是RxRoomBaseDao
并抱怨error: Dao class must be annotated with @Dao
以及两种方法error: A DAO method can be annotated with only one of the following:Insert,Delete,Query,Update
。
我还尝试了RxRoomBaseDao
的抽象类,结果相同。
这是Room编译器的已知错误或限制吗?如何在不使用Room的注释污染BaseDao
的情况下实现我的目标?
答案 0 :(得分:0)
将你的dao创建为抽象类:
instanceof
答案 1 :(得分:0)
从那时起,OP似乎从Room转移了,但是fwiw,可以使用泛型来解决这个问题:
interface BaseDao<T> {
@Insert
fun insert(vararg obj: T)
}
@Dao
abstract class DataDao : BaseDao<Data>() {
@Query("SELECT * FROM Data")
abstract fun getData(): List<Data>
}
查看&#34;使用DAO的继承功能&#34;此Official Room blog post
中的部分