具有继承接口的会议室DAO

she*_*lll 9 android android-room

我有一个DAO接口,其中有多个实现,我希望其中一个可以成为Room实现(Kotlin):

interface BaseDao {
    fun getAll(): Single<List<SomeData>>
    fun insert(data: List<SomeData>)
}
Run Code Online (Sandbox Code Playgroud)

和我的房间(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>)
}
Run Code Online (Sandbox Code Playgroud)

似乎Room编译器尝试为两种方法都编译BaseDao而不是RxRoomBaseDao和投诉。error: Dao class must be annotated with @Daoerror: A DAO method can be annotated with only one of the following:Insert,Delete,Query,Update

我也尝试了一个RxRoomBaseDao具有相同结果的抽象类。

这是Room编译器的已知错误或局限性吗?如何在不污染BaseDaoRoom注释的情况下实现我想要的?

kip*_*ip2 8

似乎 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>
}
Run Code Online (Sandbox Code Playgroud)

查看此官方 Room 博客文章中的“使用 DAO 的继承能力”部分


小智 0

将您的 dao 创建为抽象类:

@Dao
public abstract class EntityDao implements Base {

   @Override
   @Query("SELECT * FROM " + Entity.TABLE_NAME)
   public abstract Flowable<List<Entity>> getEntities();
}

interface Base {
   Flowable<List<Entity>> getEntities();
}
Run Code Online (Sandbox Code Playgroud)