我正在尝试在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表中的记录?
谢谢大家
答案 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
}
注释该对象。这会将您的前缀添加到该类的所有变量名称中。