首页 > 解决方案 > Room 数据库,使用插入查询 (OnConflictStrategy.REPLACE) 将可空的 @Embedded 数据类设置为空会导致非空内部字段上的 NPE

问题描述

有没有办法在插入时将@EmbeddedRoom 中的可空数据类设置为?我现在正在这样做:nullOnConflictStrategy.REPLACE

//in dao
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertImage(image: ImageEntity)

和实体:

@Entity(tableName = "images")
data class ImageEntity(
    @PrimaryKey
    val imageGuid: String = UUID.randomUUID().toString(),
    @Embedded(prefix = "server_")
    val serverImage: ServerImageEntity? = null,
    @Embedded(prefix ="device_")
    val deviceImage: DeviceImageEntity? = null
)

data class ServerImageEntity(
    val imageGuid: String,
    val name: String,
    val description: String?,
    val url: String,
    val status: SyncStatus = SyncStatus.IDLE
)

data class DeviceImageEntity(
    val imageGuid: String = UUID.randomUUID().toString(),
    val name: String = "",
    val description: String? = null,
    val uri: Uri,
    val status: SyncStatus = SyncStatus.IDLE
)

当我尝试这样称呼它时:

val image = database.imageDao.getImageByGuid(imageGuid)
//later on
database.imageDao.insertImage(image.copy(serverImage = null))

我得到一个 NPE 说imageGuidforserverImage是空的。初始设置后是否可以将可空@Embedded字段设置回空?

标签: androidandroid-room

解决方案


初始设置后是否可以将可空的@Embedded 字段设置回空?

我认为必须满足以下规则才能使其成为可能:-

读取嵌入字段时,如果嵌入字段(及其子字段)的 所有字段在 Cursor 中为空,则设置为空。否则,它被构造。

嵌入式


推荐阅读