查询方法参数应该是可以转换为数据库列的类型,也可以是包含该类型的列表/数组

时间:2018-12-21 13:39:21

标签: android sqlite kotlin android-room

我有一个具有自定义数据类型 FollowEntityType 作为列的数据库。

@Entity(primaryKeys = arrayOf("id", "type"), tableName = "follow_info")
data class FollowInfoEntity(
        @ColumnInfo(name = "id") var id: String,
        @ColumnInfo(name = "type") var type: FollowEntityType,
)

由于它是自定义数据类型,所以我定义了类型转换器。

class FollowDatabaseTypeConverter {

    @TypeConverter
    fun toFollowEntity(entityType: String?): FollowEntityType? {
        return FollowEntityType.from(entityType ?: Constants.EMPTY_STRING)
    }

    @TypeConverter
    fun toString(entityType: FollowEntityType?): String? {
        return entityType?.name
    }
}

这工作正常,我能够在数据库中存储/检索值。但是,在其中一个查询中,构建失败。

这是查询。

@Query("select * from follow_info where type in (:entityTypeList))
fun getFollowedEntitiesByType(entityTypeList: List<FollowEntityType>) : List<FollowInfoEntity>

构建失败,并出现以下错误。

Query method parameters should either be a type that can be converted into a database column or a List / Array that contains such type. You can consider adding a Type Adapter for this.
    java.util.List<? extends FollowEntityType> entityTypeList, @org.jetbrains.annotations.NotNull()

该错误与 entityTypeList 字段有关,根据错误,此类型应为数据库中的列之一。我已经有 FollowEntityType 作为列类型之一。我不明白为什么它会失败。请帮帮我,因为我没有找到解决此问题的任何方法。

4 个答案:

答案 0 :(得分:1)

当我在没有更新房间数据库版本的情况下更新 kotlin 库版本时发生了这个错误。

我使用的是导致问题的 Kotlin 1.5.10 和 Room 2.2.5 版。将 Room 更改为 2.3.0 修复了错误。

答案 1 :(得分:1)

在使用房间查询注释时从方法中删除挂起。喜欢

旧 - @Query("SELECT * FROM userSession where isSync=0 ORDER BY createdOnInMills") suspend fun getUnSyncSession(): List

取消挂起

新 - @Query("SELECT * FROM userSession where isSync=0 ORDER BY createdOnInMills") fun getUnSyncSession(): 列表

答案 2 :(得分:0)

我遇到了同样的问题,并报告了一个错误https://issuetracker.google.com/issues/122066791

答案 3 :(得分:0)

当我尝试在 Dao 接口中执行此查询时出现此错误;

@Query("DELETE FROM my_table WHERE customModel = :customModel")
fun deleteData(customModel: CustomModel)

通过添加@TypeConverters(MyConverter::class) 来修复它,如下所示;

@TypeConverters(MyConverter::class)
@Query("DELETE FROM my_table WHERE customModel = :customModel")
fun deleteData(customModel: CustomModel)