使用Dao在我的房间数据库中保存对象列表时

@Insert()
fun saveCharmRankMaterialCosts(materialCosts: List<CharmRankCraftingCost>) : List<Long>

这在我的存储库类中用于保存API调用的结果:

val charmRankCosts = CharmRankCraftingCost.fromJsonCraftingCost(
    charmRankId.toInt(),
    jsonCharmRank.crafting
)

// save crafting/upgrade costs for the rank
val results = charmDao.saveCharmRankMaterialCosts(charmRankCosts)
Log.d("CharmRepository", "Saved charm material costs: ${results.toString()}");
assert(!results.contains(-1))

运行此代码时,将返回插入ID,并且不会触发断言(即,没有插入失败)。

但是,当我检查设备上的数据库时,表中大多数假定插入的ID都丢失了。我对这里发生的事情感到非常困惑。我已经调试了这个问题很多小时,但未能成功进行。有什么明显的我想念的东西吗?

最佳答案

这个问题似乎与外键约束有关。我有一个带有多个相关数据对象的CharmRank数据类。见下文:

/**
 * Copyright Paul, 2020
 * Part of the MHW Database project.
 *
 * Licensed under the MIT License
 */
@Entity(tableName = "charm_ranks")
data class CharmRank(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "charm_rank_id")
    var id: Int = 0,

    @ColumnInfo(name = "charm_id")
    var charmId : Int,

    @ColumnInfo(name = "charm_rank_level")
    var level: Int = 0, // 3

    @ColumnInfo(name = "charm_rank_rarity")
    var rarity: Int = 0, // 6

    @ColumnInfo(name = "charm_rank_name")
    var name: String = "",

    @ColumnInfo(name = "craftable")
    var craftable: Boolean
)

每个护身符等级都有相关的技能和物品来制作所述的等级。这些对象只是关系对象,因为它们包含CharmRankSkillRank的ID(对于技能对象),或者CharmRank的ID和Item对象的ID。
data class CharmRankSkill(

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "charm_rank_skill_id")
    var id: Int,

    var charmRankId : Int,

    var skillRankId: Int
)
data class CharmRankCraftingCost(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "charm_rank_crafting_cost_id")
    var id: Int,

    @ColumnInfo(name = "charm_rank_id")
    var charmRankId: Int,

    @ColumnInfo(name = "charm_rank_crafting_cost_item_quantity")
    val quantity: Int,

    val itemId: Int
)

最初在CharmRankCraftingCost中,我对Item对象和CharmRank对象具有外键约束。下面是Item对象的外键约束:
ForeignKey(
  entity = Item::class,
  parentColumns = ["item_id"],
  childColumns = ["itemId"],
  onDelete = ForeignKey.CASCADE
)
Item数据对象具有由远程数据源提供的ID,因此当我将项目插入到其各自的表中时,冲突解决方案设置为Replace。在将关系项保存到CharmRanks的数据库的过程中,我还必须先保存Item对象,然后再保存CharmRankCraftingCosts。似乎正在发生的事情是,当插入Item对象时,有时这些项将被替换,这将触发外键的级联操作,导致我刚刚保存的CharmRankCraftingCosts项由于级联而被删除了。影响。

删除CharmRank表上的外键约束解决了我的问题。

10-07 19:46
查看更多