首页 > 解决方案 > 屏幕方向更改时数据库条目损坏

问题描述

我有一个使用 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?

标签: androidandroid-room

解决方案


好的,首先我的问题是 Room 中没有@Upsert注释,我只是假设它@Insert(onConflict = OnConflictStrategy.REPLACE)做同样的事情,但事实并非如此。它实际上删除了它并插入了一个新条目,而不是更新条目。碰巧在我的片段中有一个TextWatcher连接到文本字段,它在一个条目上执行了所述插入,该条目使用FOREIGN KEY ON DELETE CASCADE. 在触发事件的方向更改TextWatcher期间,在插入期间删除条目实际上级联并删除了所有引用它的条目,这导致了问题


推荐阅读