具有改建嵌套对象响应的房间持久性

时间:2019-07-08 15:33:06

标签: android kotlin retrofit android-room

我正在尝试在Room db中存储一些改造响应。改造响应具有嵌套对象,因此我试图将其放在room db内的单独表中,但是我在使用外键时遇到了一些问题。

我来自响应的“ Exif”实体在Photo实体中没有用作外键的ID,因此我手动设置了此属性。

当我尝试在Room db中插入照片时,它因以下错误而崩溃: android.database.sqlite.SQLiteConstraintException:FOREIGN KEY约束失败(Sqlite代码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))
            }
        }
    }
}

我的目标是拥有一个用于改造复杂响应和房间db的类。

是否可以使用Photo类中的exif属性来“指向” Exif表中的记录?

谢谢大家

1 个答案:

答案 0 :(得分:0)

尝试使用@Embedded的{​​{1}}注释,如下所示。这样,您将不需要第二张表或任何外键。另外,从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 } 注释该对象。这会将您的前缀添加到该类的所有变量名称中。