android - 屏幕方向更改时数据库条目损坏
问题描述
我有一个使用 Room 处理数据库的 Android 应用程序。在 onViewCreated 的片段之一中,我使用简单查询从数据库中获取一个对象SELECT * FROM table WHERE id = ?
。查询的 id 存储在 Fragment 的参数 Bundle 中。它工作正常,但是当我更改方向并且系统重新创建片段时,相同的查询返回 null,并且我无法从应用程序中的任何其他查询中获取此条目。
我检查了 id,它在方向改变后并没有消失,我使用调试器拦截了对数据库的所有查询,只有 SELECT 查询,没有 DELETE、UPDATE 或 INSERT
UPD:代码
分段
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_lesson_client, container, false);
ButterKnife.bind(this, view);
lesson = App.Companion.getDb().lessonDao().getLesson(getArguments().getLong("lesson"));
道
@Query("SELECT * FROM Lesson WHERE id == :id")
fun getLesson(id: Long): Lesson?
解决方案
好的,首先我的问题是 Room 中没有@Upsert
注释,我只是假设它@Insert(onConflict = OnConflictStrategy.REPLACE)
做同样的事情,但事实并非如此。它实际上删除了它并插入了一个新条目,而不是更新条目。碰巧在我的片段中有一个TextWatcher
连接到文本字段,它在一个条目上执行了所述插入,该条目使用FOREIGN KEY ON DELETE CASCADE
. 在触发事件的方向更改TextWatcher
期间,在插入期间删除条目实际上级联并删除了所有引用它的条目,这导致了问题
推荐阅读
- c# - MagickBlobErrorException:没有这样的文件或目录
- kotlin - kotlin kotest/kotlintest BehaviorSpec afterSpec/finalizeSpec 调用太频繁或根本不调用
- c# - 不返回对象的多种数据类型的解析器
- java - 将字节数组从 PLC 转换为 JSON 或 Java 对象
- c# - MEF 导入对我不起作用,但容器按预期工作
- java - 在数据库中显示来自 url 的图像
- scala - 有没有更好的方法来过滤未来
- rust - 将任何 Diesel 表作为参数传递
- node.js - GitHub Actions:将生成的目录复制到 Docker 映像时出错
- javascript - 过去和日期比较条件