База данных помещения, установка нуля класса данных @Embedded на null с помощью запроса вставки (OnConflictStrategy.REPLACE) вызывает NPE для ненулевых внутренних полей - PullRequest
0 голосов
/ 06 ноября 2019

Есть ли способ установить для значений Nullable @Embedded классов данных в комнате значение null при вставке с помощью OnConflictStrategy.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 говорит, что imageGuid для serverImage является нулевым. Можно ли вернуть пустые поля @Embedded обратно в ноль, как только они будут установлены?

1 Ответ

0 голосов
/ 06 ноября 2019

Можно ли установить пустые поля @Embedded на null, если они установлены изначально?

Я считаю, что для того, чтобы это было возможно, должно быть соблюдено следующее правило: -

Когда читается встроенное поле, если все поля встроенного поля (и его подполей) равны нулю в Курсоре, то оно устанавливается равным нулю. В противном случае оно построено.

Встроено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...