TypeConverters在@Query中不适用于集合

时间:2019-03-17 16:50:33

标签: android kotlin android-room android-architecture-components

我有一个称为“事件”的实体,其定义如下:

@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>的大小并添加相同数量的?

为什么不使用我的TypeConverter?在其他查询(@Insert@Query(对于SELECT)中,我没有遇到这个问题。其他TypeConverter也可以正常工作。

编辑:如果我使用List<String> + TypeConverter而不是Set<String>,也会发生同样的问题。

2 个答案:

答案 0 :(得分:0)

查看“房间”文档,似乎每当我们在Collection中使用@Query时,它都会绕过TypeConverter并立即变平。

例如,此:

@Query("SELECT * FROM Customers WHERE city IN (:cities)")
fun getCustomersInCities(cities: List<String>): Flowable<List<Customer>>

如果SELECT * FROM Customers WHERE city IN ('london', 'paris')包含“伦敦”和“巴黎”,则返回cities

不幸的是,以下内容也以类似的方式转换:

@Query("UPDATE Customers SET phoneNumbers = :phoneNumbers WHERE id = :id")
fun updateCustomerPhoneNumbers(id: Long, phoneNumbers: List<String>)

如果UPDATE Customers SET phoneNumbers = 1234567890, 9876543210 WHERE id = 23为23,并且id包含“ 1234567890”和“ 9876543210”,则结果为phoneNumbers

尽管这样做确实有道理,但确实很不方便,应将其记录在案。

答案 1 :(得分:0)

此解决方案对我有用: TypeConverter not working when updating List<Boolean> in Room Database

基本上,将List<String>替换为ArrayList<String>