Постоянство комнаты с ответом вложенного объекта - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь сохранить некоторую модификацию ответа в комнате дБ.В ответе на модификацию есть вложенный объект, поэтому я пытаюсь поместить его в отдельную таблицу внутри комнаты db, но я сталкиваюсь с некоторой проблемой с внешними ключами.

Моя сущность "Exif" из ответа не имеет идентификатораиспользовать в качестве внешнего ключа в объекте Photo, поэтому я помещаю этот атрибут вручную.

Когда я пытаюсь вставить фотографии в базу данных, происходит сбой с этой ошибкой: android.database.sqlite.SQLiteConstraintException: ограничение FOREIGN KEY не выполнено(Sqlite code 787), (Ошибка ОС - 0: Успех)

@Entity(
    tableName = "photo_table", foreignKeys = [ForeignKey(
        entity = Exif::class,
        parentColumns = ["id"],
        childColumns = ["exif"]
    )]
)
class Photo {
    constructor()

    constructor(value: String) {
        val gson = Gson()
        gson.fromJson(value, Photo::class.java)
    }

    @PrimaryKey(autoGenerate = false)
    @SerializedName("id")
    @Expose
    var id: String = ""

   // other stuffs

    @SerializedName("exif")
    @Expose
    @ColumnInfo(name="exif")
    var exif: Exif? = null
}


@Entity(tableName = "exif_table")
class Exif {
    constructor()
    constructor(value: String){
        val gson = Gson()
        gson.fromJson(value, Exif::class.java)
    }

    @PrimaryKey(autoGenerate = true)
    @Expose
    @ColumnInfo(name="id")
    var id: Int? = null

    @SerializedName("model")
    @Expose
    var model: String? = ""
    // Some code
}

class PhotoRepository (private val photoDao: PhotoDao, private val exifDao: ExifDao) {
@WorkerThread
    suspend fun insert(photos: List<Photo>){
        val resultIds = ArrayList<Long>()
        photos.forEach { photo ->
            if (photo.exif!=null){
                val exifId = exifDao.addExif(photo.exif!!)
                resultIds.add(photoDao.addPhoto(photo))
            }
        }
    }
}

Моя цель состоит в том, чтобы иметь один класс для модифицированного комплексного ответа и для комнаты дБ.

Есть ли способ использовать атрибут exif в классе Photo для "указания" на запись в таблице Exif?

Спасибо всем

1 Ответ

0 голосов
/ 08 июля 2019

Попробуйте использовать @Embedded аннотацию Room, как показано ниже. Таким образом, вам не понадобится вторая таблица или какой-либо внешний ключ. Также удалите аннотацию @ColumnInfo из свойства exif.

@Entity(
    tableName = "photo_table", foreignKeys = [ForeignKey(
        entity = Exif::class,
        parentColumns = ["id"],
        childColumns = ["exif"]
    )]
)
class Photo {

    // other stuff

    @SerializedName("exif")
    @Expose
    @Embedded
    var exif: Exif? = null
}

Если у вас есть объект какого-то другого класса модели, в котором также содержится то же имя переменной, чем просто аннотируйте этот объект с помощью @Embedded(prefix = “some_name”). Это добавит ваш префикс ко всем именам переменных для этого класса.

...