我有一个称为“事件”的实体,其定义如下:
@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>
,也会发生同样的问题。
答案 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>
。