android - Room Dao 返回插入 ID,但数据库中缺少数据

标签 android kotlin android-sqlite android-room

使用 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/

相关文章:

java - 数据库拒绝删除项目

android - Android Corona sdk 的 Inapp Restore?

java - 蓝牙回调函数 onCharacteristicRead 没有对使用 <API 21 的另一个 Activity 进行 Intent 调用。不在 Marshmallow 中

java - Kotlin + Java 9 模块(使用 Java 11)+ maven

android - 无法在 Motionlayout 中的两个不同元素上执行两个操作 |安卓工作室

android - 我的光标只显示从 sqlite 数据库导入的 5 个项目

android - 更改图像按下状态下的不透明度

java - 由于没有服务而无法启动香料管理器(Robospice)

swift - Swift 中的 Kotlin 枚举类

android - 使用 rawQuery 的 sql 查询问题