You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Room实体新增可空SessionSettings字段默认存null失败的解决咨询

问题描述

我正在修改项目中的现有Patient实体,新增了sessionSettings字段,搭配SessionSettingsConverters实现JSON序列化。该字段需默认设为null(为空时将从其他源获取数据),但单元测试中默认null时保存实体失败,初始化SessionSettings对象则正常。想咨询是否可实现默认存null无需初始化,或是否需添加布尔标记跟踪编辑状态。

相关代码

Patient实体类

data class Patient(
    // ... 其他字段
    @Expose
    @SerializedName("exo_settings")
    @Embedded
    var exoSettingsData: ExoSettingsData? = null,   // 已存在字段

    @Expose
    @SerializedName("session_settings")
    @TypeConverters(SessionSettingsConverters::class)
    var sessionSettings: SessionSettings? = null,   // 新增字段
    /// ... 其他字段
)

SessionSettingsConverters类

class SessionSettingsConverters {
    private var gson = Gson()

    @TypeConverter
    fun stringToSessionSettings(data: String?): SessionSettings? {
        if (data.isNullOrEmpty()) {
            return null
        }

        val sessionSettingsType = object : TypeToken<SessionSettings>() {}.type

        return gson.fromJson(data, sessionSettingsType)
    }

    @TypeConverter
    fun sessionSettingsToString(someObject: SessionSettings): String? {
        return gson.toJson(someObject)
    }
}

测试代码示例

  • 默认null时失败:
val patient1 = Patient("1", synkStatus = SynkStatus.DELETED)
centerDatabase.patientDao().savePatient(patient1).test()
  • 初始化对象时成功:
val patient1 = Patient("1", synkStatus = SynkStatus.DELETED, sessionSettings = SessionSettings())
centerDatabase.patientDao().savePatient(patient1).test()
解决方案

问题出在SessionSettingsConverters的sessionSettingsToString方法上:该方法的参数是非空的SessionSettings,但当sessionSettings字段为null时,Room会尝试调用这个转换器并传入null,直接触发参数不匹配的错误,导致保存失败。

只需修改转换器方法,让它支持处理null参数即可,无需添加布尔标记:

class SessionSettingsConverters {
    private val gson = Gson()

    @TypeConverter
    fun stringToSessionSettings(data: String?): SessionSettings? {
        if (data.isNullOrEmpty()) {
            return null
        }

        val sessionSettingsType = object : TypeToken<SessionSettings>() {}.type
        return gson.fromJson(data, sessionSettingsType)
    }

    @TypeConverter
    fun sessionSettingsToString(someObject: SessionSettings?): String? {
        // 当对象为null时直接返回null,Room会将字段存储为null
        return someObject?.let { gson.toJson(it) }
    }
}

修改后,当sessionSettings为null时,转换器返回null,Room会正常将该字段存储为null,无需提前初始化SessionSettings对象,完全符合需求。

内容的提问来源于stack exchange,提问作者Navalex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:09