【问题标题】:Room field initialized at null房间字段初始化为空
【发布时间】:2023-02-23 03:52:08
【问题描述】:

我正在编辑项目的现有实体,如下所示(我添加了 sessionSettings 字段):

data class Patient(
    
    // ... other fields
    
    @Expose
    @SerializedName("exo_settings")
    @Embedded
    var exoSettingsData: ExoSettingsData? = null,   // already exist

    @Expose
    @SerializedName("session_settings")
    @TypeConverters(SessionSettingsConverters::class)
    var sessionSettings: SessionSettings? = null,   // the new field
    
    /// ... other fields

)

我的 TypeConverter 类:

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)
    }
}

我添加了会话设置;这是一个包含字符串和整数的基本对象,它是 TypeConverter 以简化集成。我的问题是,我需要这个字段默认为空,因为如果是,我正在从另一个来源获取数据。问题是,如果我这样做,我的单元测试就会被破坏,例如:

val patient1 = Patient("1", synkStatus = SynkStatus.DELETED)
centerDatabase.patientDao().savePatient(patient1).test()

它失败了(实体没有保存),但是如果我初始化一个 SessionSettings 对象,它就可以工作:

val patient1 = Patient("1", synkStatus = SynkStatus.DELETED, sessionSettings = SessionSettings())
centerDatabase.patientDao().savePatient(patient1).test()

所以我的问题是:有没有办法允许保存这个实体而不初始化这个字段以默认保持它为空?或者唯一的方法是添加一个布尔值来跟踪该字段是否已被编辑?

谢谢

【问题讨论】:

    标签: kotlin android-room


    【解决方案1】:

    问题您的问题似乎是 TypeConverter 在转换 SessionsSettings 时不接受空值。

    修复

    改为使用someObject: SessionSettings?即添加了?

    工作示例/演示

    下面演示了使用基于您的代码的代码的细微变化,即:-

    data class SessionSettings(
        val ssname: String,
        val ssine: Int
    )
    
    @Entity
    data class Patient(
        @PrimaryKey
        val patientId: Long?=null,
        val patientName: String?=null,
        var sessionSettings: SessionSettings?,   // the new field
        /// ... other fields
    )
    
    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)
        }
    }
    
    @Dao
    interface SO75530351DAO {
        @Insert
        fun insert(patient: Patient): Long
        @Query("SELECT * FROM patient")
        fun getAllPatients(): List<Patient>
    }
    
    @TypeConverters(SessionSettingsConverters::class)
    @Database(entities = [Patient::class], exportSchema = false, version = 1)
    abstract class SO75530351DB: RoomDatabase() {
        abstract fun getDao(): SO75530351DAO
        companion object {
            private var instance: SO75530351DB?=null
            fun getInstance(context: Context): SO75530351DB {
                if (instance==null) {
                    instance=Room.databaseBuilder(context,SO75530351DB::class.java,"so75539351.db")
                        .allowMainThreadQueries()
                        .build()
                }
                return instance as SO75530351DB
            }
        }
    }
    

    并使用以上内容:-

        dbx = SO75530351DB.getInstance(this)
        daox = dbx.getDao()
    
        daox.insert(Patient(patientName = "Fred"))
        daox.insert(Patient(patientName = "Mary", sessionSettings = SessionSettings("SESSION1",10)))
        for(p in daox.getAllPatients()) {
            Log.d("DBINFO","Patient is ${p.patientName} ID is ${p.patientId} ${p.sessionSettings}")
        }
    

    运行后的日志:-

    D/DBINFO: Patient is Fred ID is 1 null
    D/DBINFO: Patient is Mary ID is 2 SessionSettings(ssname=SESSION1, ssine=10)
    

    数据库,通过 App Inspection,:-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多