【问题标题】:Room persistence with retrofit nested object response带有改造嵌套对象响应的房间持久性
【发布时间】:2019-11-18 03:58:13
【问题描述】:

我正在尝试在房间数据库中存储一些改造响应。改造响应有嵌套对象,所以我试图将它放在房间 db 内的单独表中,但我遇到了一些外键问题。

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

当我尝试在房间数据库中插入照片时,它会因以下错误而崩溃: android.database.sqlite.SQLiteConstraintException: FOREIGN KEY 约束失败 (Sqlite code 787), (OS error - 0:Success)

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

我的目标是为改造复杂响应和房间数据库创建一个类。

有没有办法在 Photo 类中使用 exif 属性来“指向”Exif 表中的记录?

谢谢大家

【问题讨论】:

    标签: android kotlin retrofit android-room


    【解决方案1】:

    尝试使用Room@Embedded 注释,如下所示。这样,您将不需要第二张表或任何外键。另外,从exif 属性中删除@ColumnInfo 注释。

    @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”) 注释该对象。这会将您的前缀添加到该类的所有变量名称中。

    【讨论】:

    • 感谢您的回复。在 json 响应中,我还有其他对象,例如用户数据,所以在照片模型中我有一个用户属性。我已经展示了 Exif 的简洁性,但我真的需要尝试外键,因为我将需要它用于其他对象(链接在照片对象中的“用户”将存储在用户表中)
    猜你喜欢
    • 2017-11-08
    • 1970-01-01
    • 2013-09-24
    • 2019-08-08
    • 1970-01-01
    • 2017-10-29
    • 2018-05-27
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多