首页 > 解决方案 > 一对多实体列表显示来自另一个活动的临时实体

问题描述

我有两个活动。第一个活动显示笔记列表。Notes本身就是列表。我使用 Android 架构组件:ViewModel、LiveData;使用 Repository、Room、Dao 等。所以,我getAllNotes()在 Dao、Repository 和 ViewModel 中创建了一个方法,就像在谷歌示例应用程序中一样。在onCreate第一个活动的方法中,我调用observe并设置了 RecyclerView 的适配器内容。它工作正常 - 它显示带有Note标题的列表。像那样:

override fun onCreate(savedInstanceState: Bundle?) {
   //some code
   viewModel = obtainViewModel()
   viewModel.getAllNotes().observe(this, Observer<List<Notes>> { notes ->
       recView.setNote(notes)
   }
}

然后我有一个按钮可以启动新的 Activity 来创建新的Note. 该注释包含Lines 列表,目前仅包含字符串和外键。

data class Line {
    var id: Long? = null
    var note_id: Long? = null
    var payload: String? = null
}

Note并且Line是一对多的关系,它们由idofNote和外键note_idin连接Line。(我不会在这里写所有代码,它可以工作,相信我)

问题是,要插入Lines数据库,我首先需要插入父级Note,然后我就这样做了。它也几乎可以正常工作。但是第一个 Activity 的 liveDatagetAllNotes()会通过这个插入得到通知。如果用户因此决定删除所有行并返回第一个活动,即使我Note从数据库中删除临时实体,第一个活动上的列表也会暂时显示它,因为它在后台被删除一个小小的延迟。

我认为的解决方案:

1) 从 livedata 取消订阅观察者。我尝试在 onStop 方法中执行此操作,但它在onCreate创建实体的第二个活动的方法之后被调用,因此 livedata 已经得到通知,并且在临时Note传递到列表后删除了观察者。

2) 不使用 Room/SQLite 作为缓存。由于此 Note 和 Lines 不能保证保留,因此不应显示或插入到表格中。所以,我可以将它全部保存在 viewModel 的属性中(即在内存中)。但是我看到了很多开销工作来通过屏幕旋转来保存这些实体,最小化应用程序以及所有通过保存状态和恢复它的东西。

3)创建两个额外的实体,如 CachedNote 和 CachedLine 以及相应的表,以使用它,直到我决定持久化工作,将其插入原始表并显示它。

4) 向 Note 实体添加属性,如“可见”,并将此参数添加到 Query,以显示实体注释,直到我决定坚持工作。但是每个地方都可能有很多“updateNoteWithLines”。

我应该怎么办?我没有谷歌任何有用的东西。我知道这就像“什么是最好的方法问题”,请原谅我。

标签: androidandroid-architecture-componentsandroid-livedataandroid-viewmodel

解决方案


您可以尝试先拨入observeonResume拨入removeObserveronPause这样Activity就不会更新了,请看这里的例子。


推荐阅读