使用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
)
每个护身符等级都有相关的技能和物品来制作所述的等级。这些对象只是关系对象,因为它们包含
CharmRank
和SkillRank
的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
表上的外键约束解决了我的问题。