簡體   English   中英

具有改建嵌套對象響應的房間持久性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM