【发布时间】:2019-03-17 16:50:32
【问题描述】:
我有一个名为 Events 的实体,其定义如下:
@Entity(tableName = "Events")
data class Event(@PrimaryKey val id: Long, val name: String, val venues: Set<String>, val rating: Int)
我有一对@TypeConverter处理Set<String>的方法:
@TypeConverter
fun fromStringToStringSet(str: String): Set<String> = str.split("<|>")
@TypeConverter
fun fromStringSetToString(set: Set<String>): String = set.joinToString("<|>")
在我的Dao 中,我有一个用@Query 注释的方法,如下所示:
@Query("UPDATE Events SET name = :name, venues = :venues WHERE id = :id")
fun updateAndRetainRating(id: Long, name: String, venues: Set<String>)
当我尝试更新具有 2 个场所的事件时,我收到一个运行时错误,告诉我无法编译 SQL。生成的 SQL 是:
UPDATE Events SET name = ?, venues = ?,? WHERE id = ?
这显然是错误的。查看生成的代码,Room 的大小为Set<String>,并添加了相同数量的?s。
为什么我的TypeConverter 没有被使用?我在其他查询中没有遇到这个问题(@Insert 和 @Query(对于SELECT))。其他TypeConverters 也工作正常。
编辑:如果我使用 List<String> + TypeConverters 而不是 Set<String>,也会出现同样的问题。
【问题讨论】:
-
androidx版本2.1.0-alpha04和2.1.0-alpha05都会出现此问题。 -
题外话:套装不保证订购。一次您可能会收到
Wembley|LBC另一次LBC|Wembley。祝你调试好运。也许将场地包装在一个自定义对象中,该对象将处理排序。 -
@EugenPechanec 订购对我的用例并不重要。
标签: android kotlin android-room android-architecture-components