android - 一对多实体列表显示来自另一个活动的临时实体
问题描述
我有两个活动。第一个活动显示笔记列表。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
. 该注释包含Line
s 列表,目前仅包含字符串和外键。
data class Line {
var id: Long? = null
var note_id: Long? = null
var payload: String? = null
}
Note
并且Line
是一对多的关系,它们由id
ofNote
和外键note_id
in连接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”。
我应该怎么办?我没有谷歌任何有用的东西。我知道这就像“什么是最好的方法问题”,请原谅我。
解决方案
您可以尝试先拨入observe
再onResume
拨入removeObserver
,onPause
这样Activity
就不会更新了,请看这里的例子。
推荐阅读
- node.js - AWS iam.deleteAccessKey 在 Node10 Lambda 中不可靠
- c - 在链接/编译时静态包含所有库而不是库的一部分
- sql-server - 作为服务运行时 ODBC SQLDriverConnect 崩溃
- react-native - 如何通过本机反应显示来自 JSON 的正确 html 符号
- zsh - zsh 不打印从标准输入接收到的命令
- javascript - 如何在写作时将表情符号字符串转换为它的图标?
- r - 将 shinydashboard 上传到 shiny.io 时出错
- apache-spark - 使用 Window() 计算 PySpark 中数组的滚动总和?
- python - Python:输入中的Split()方法改变基于文本的RPG游戏中的“if”语句结果
- wavefront - 波前材料文件是否需要指定所有颜色类型,还是只能使用一种?