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
相关产品推荐
相关产品推荐

