使用 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
的 ID。和一个 SkillRank
对于技能对象,或 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
保存的项目由于级联效应而被删除。
删除 Item
上的外键约束表解决了我的问题。
关于android - Room Dao 返回插入 ID,但数据库中缺少数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61823426/