【发布时间】:2020-05-15 15:55:10
【问题描述】:
使用 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 都从表中丢失了。我对这里发生的事情感到非常困惑。我已经调试了这个问题很多小时,但未能成功。我有什么明显的遗漏吗?
【问题讨论】:
-
1.你确定你检查了确切的数据库吗?有时会在处理设备文件资源管理器、复制数据库文件等过程中出现混乱。 2. 也许您的代码中还有其他地方可以更改数据库(在另一个线程中),删除插入的行?
-
@sergiytikhonov 我很确定我正在查看正确的数据库,但我会仔细检查。我也可以尝试在 android studio 4.1 中使用数据库检查器
-
至于删除,我会在保存新项目之前清除表格,所以在保存内容时可能会调用删除函数?
-
如果你之前做了清除(在一个线程或一个协程中)它不应该影响。顺便说一句,您的代码不清楚您使用什么来从主线程切换数据库操作。
-
代码在我的存储库中,用于视图模型,在我的视图中可以从 IO 调度程序上的协程访问。
标签: android kotlin android-sqlite android-room