仅选择一列时Android房间类型转换器不转换

标签 android android-room android-architecture-components

我有一个名为 Chacara 的类,它具有各种属性,包括 thumbList ,它是一个 List< String >

将其保存到 ROOM 时,我使用类型转换器:

class DbTypeConverter {

    @TypeConverter
    fun listToString(list: List<String>): String = Gson().toJson(list)

    @TypeConverter
    fun stringToList(string: String): List<String> {
        return Gson().fromJson<List<String>>(string, object: TypeToken<List<String>>() {}.type)
    }

}

当我获取整个对象并访问 thumbList 属性时,它按预期工作:
@Query("SELECT * FROM chacara WHERE id = :id LIMIT 1")
abstract fun getChacaraWithId(id: String): LiveData<Chacara>

但是,当我尝试仅获取 thumbList 属性时,结果不会被转换:
@Query("SELECT thumbUrlList FROM chacara WHERE id = :id")
abstract fun getChacaraThumbList(id: String): LiveData<List<String>>

我还向 TypeConverter 添加了一个日志,以确保它没有被调用。

TL;DR : ROOM 不调用 TypeConverter 也不将 String 转换回 List (SELECT 'column_name'),但在请求整个对象时工作 (SELECT *)

最佳答案

我的查询有同样的问题。
我想选择一个日期,但没有成功。

@Query("SELECT MAX(downloadDate) FROM table WHERE key=:key")
abstract fun selectMaxDownloadDateByKey(key: String): Date?

Room 不知道需要将下载日期转换为日期。
所以我将查询更改如下:
@Query("SELECT MAX(downloadDate) as Date FROM table WHERE key=:key")
abstract fun selectMaxDownloadDateByKey(key: String): Date?

它有效。

因此,尝试将您的查询更改为:
@Query("SELECT thumbUrlList as String FROM chacara WHERE id = :id")
abstract fun getChacaraThumbList(id: String): LiveData<List<String>>

我希望它适用于 LiveData 并列出结果

关于仅选择一列时Android房间类型转换器不转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46943612/

相关文章:

java - Android 将字符串保存到数据库

android - 使用Android架构组件LiveData&ViewModel时是否需要使用onSaveInstanceState和onRestoreInstanceState?

android - 我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?

android - 为什么partial invalidate会跨越整个View?

android - 开启第二个 Activity 失败

android - 将 Mockito Matchers.any() 与 android.support.annotation.IntDef 自定义注释一起使用

android - 房间存储库 : Selecting one row by ID

Android Persistence room : "Cannot figure out how to read this field from a cursor"

android - WorkManager两次启动Worker

android - 如何更改导航 Controller 中目的地的标签属性?