[英]Room persistence with retrofit nested object response
我正在嘗試在Room db中存儲一些改造響應。 改造響應具有嵌套對象,因此我試圖將其放在room db內的單獨表中,但是我在使用外鍵時遇到了一些問題。
我來自響應的“ Exif”實體沒有一個ID可以用作Photo實體中的外鍵,因此我手動設置了此屬性。
當我嘗試在房間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))
}
}
}
}
我的目標是只有一個類來改造復雜的響應和房間數據庫。
有沒有一種方法可以使用Photo類中的exif屬性來“指向” Exif表中的記錄?
謝謝大家
嘗試使用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”)
注釋該對象。 這會將您的前綴添加到該類的所有變量名稱中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.