Kotlin:如何将对象列表插入Room?

JJD*_*JJD 6 android kotlin android-room

我试图在基本接口中定义常见的CRUD方法,如下所示:

interface BaseDao<in I> {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun create(obj: I)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun createAll(objects: List<I>)

    @Delete
    fun delete(obj: I)

}
Run Code Online (Sandbox Code Playgroud)

Room的以下ProductDao接口继承自基接口:

@Dao
interface ProductDao : BaseDao<Product> {

    // Specific methods

}
Run Code Online (Sandbox Code Playgroud)

当我编译定义时fun createAll(objects: List<I>)产生以下错误:

参数的类型必须是使用@Entity或其集合/数组注释的类.

Waq*_*Haq 8

我已经通过以下方式解决了问题:

@Dao
interface BaseDao<T> {

    /**
     * Insert a list in the database. If the item already exists, replace it.
     *
     * @param list the items to be inserted.
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    @JvmSuppressWildcards
    abstract fun insertAll(list: List<T>)

}
Run Code Online (Sandbox Code Playgroud)

@JvmSuppressWildcards 帮我解决了这个问题


nsc*_*012 6

尝试添加@JvmSuppressWildcards到您的功能.

@Insert
@JvmSuppressWildcards
fun createAll(objects: List<I>)
Run Code Online (Sandbox Code Playgroud)

来自文档:

指示编译器为与声明 - 站点差异的参数对应的类型参数生成或省略通配符,例如Collection has.

只有声明似乎不方便从Java使用它可能会有所帮助.


p.a*_*xey 0

您应该@Entity为您的模型类添加注释(您应该为 Dao 方法提供具体的模型类),但您在接口中使用泛型BaseDao<in I>https://developer.android.com/training/data-storage/room/defining-data.html