房间DAO具有继承的接口

时间:2017-12-07 15:24:17

标签: android android-room

我有一个 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的情况下实现我的目标?

2 个答案:

答案 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

中的部分