【问题标题】:TypeConverters not working for Collections in @QueryTypeConverters 不适用于 @Query 中的集合
【发布时间】: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&lt;String&gt;的方法:

@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&lt;String&gt;,并添加了相同数量的?s。

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

编辑:如果我使用 List&lt;String&gt; + TypeConverters 而不是 Set&lt;String&gt;,也会出现同样的问题。

【问题讨论】:

  • androidx 版本 2.1.0-alpha042.1.0-alpha05 都会出现此问题。
  • 题外话:套装不保证订购。一次您可能会收到Wembley|LBC 另一次LBC|Wembley。祝你调试好运。也许将场地包装在一个自定义对象中,该对象将处理排序。
  • @EugenPechanec 订购对我的用例并不重要。

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


【解决方案1】:

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

例如,这个:

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

如果cities 包含“london”和“paris”,则结果为SELECT * FROM Customers WHERE city IN ('london', 'paris')

很遗憾,下面的也是类似的转换方式:

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

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

虽然这确实有道理,但确实很不方便,应该更清楚地记录下来。

【讨论】:

  • 我不接受这个答案,因为这不能解决问题。如果有人提出更好的解决方案,我会接受他们的回答。
【解决方案2】:

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

基本上,将List&lt;String&gt; 替换为ArrayList&lt;String&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2016-06-28
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多