- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到 android Room 库有一些奇怪的行为(至少对我来说看起来很奇怪)。
虽然还有其他帖子有类似问题,但(我能找到的)没有一个与此完全相同。
我的问题是,当我观察一个 LiveData
对象时,我的观察者的 onChange()
方法被多次调用,但仅用于 INSERT 操作。对于我插入的每个对象,该方法将被触发一次(即,如果我插入一个包含 N 个对象的列表,它将被触发 N 次),而对于其他操作(例如 DELETE),无论列表的大小如何,它都会被触发一次我正在删除。
我的 DAO 中有以下查询:
@query("select * from myTable")
LiveData<myEntity> getAll();
@insert
void insert(List<myEntity> entities);
@delete
void delete(List<myEntity> entities);
我正在观察 getAll()
方法,我肯定会调用 delete()
和 insert()
方法一次 - 某事像这样:
public void insertAll(List<myEntity> items)
{
myDao.insert(items);
}
和
public void deleteAll(List<myEntity> items)
{
myDao.delete(items);
}
由于在我的 onChange()
方法中我更新了一个用户可见的 RecyclerView
适配器,这是一个问题,因为我得到了很多重复项并且我还在那里做了一些其他的事情,这些事情实际上应该只在每次表更改时执行一次,但它们会执行很多次(正如我所说的,每插入一个项目一次)。
我已阅读这篇文章并尝试实现技巧 7,但问题仍然存在。 https://medium.com/google-developers/7-pro-tips-for-room-fbadea4bfbd1
这是设计使然并被认为是正常行为吗?我该怎么做才能让我的观察者只为每个 INSERT 操作触发一次(即使我同时插入多个对象)?
最佳答案
虽然我不完全理解它,但我找到了解决方案!
我的问题是我正在从 onNewIntent()
调用 observe()
并且我的调用看起来像这样:
mViewModel.getAll().observe(this, new Observer<ArrayList<MyObject>>()...);
我从 onNewIntent()
调用这个的原因是这个 Activity 可以从我的应用程序的几乎任何地方打开,使用标志 BRING_TO_FRONT
(或任何它叫的)所以 onCreate()
不能保证被调用所以我想我最好通过将它放在 onNewIntent()
中来确保调用观察者。我看了他们说的文档
If the given owner, observer tuple is already in the list, the call is ignored.
所以我以为我是安全的。由于某种原因我没有意识到的是,我实际上每次都在使用 new
关键字创建一个新的观察者。结合从 onNewIntent()
调用它会导致多个重复 观察者,从而导致 onChanged()
方法被多次触发(嗯,实际上它只被调用了一次,但每个观察者一次!)。
一旦我将 observe()
调用移至 onCreate()
,问题就解决了,我得到了一次对 onChanged()
的调用即使我将多个项目插入到我的表中。
然而,这仍然没有解释 delete
方法如何只被调用一次用于多个...
关于android - Room LiveData 观察器 (onChange) 触发多次但仅针对 INSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50550074/
即使从 androidx.room.Room 导入,Room.databaseBuilder() 也无法找到 Room 依赖项。 我为数据库制作了一个不同的 Kotlin 库,并在 Room 的 gr
我正在尝试迁移我们的项目以使用 Room,顺便说一句,我认为这是向前迈出的一大步。 我有以下结构: public class Entity extends BaseObservable { @
Here是房间数据库的官方文档。它包含以下代码 val db = Room.databaseBuilder( applicationContext, A
Here是房间数据库的官方文档。它包含以下代码 val db = Room.databaseBuilder( applicationContext, A
我有一张供用户使用的表。用户创建一个类别,然后将 Youtube 视频分配到该类别。我目前有一个用户表、类别表(用户 ID 外键)和 youtubevideo 表(用户 ID 外键、类别外键)。 我目
拥有三张 table 的 Android Room timestamp , index , details ,并且这三个都有 @PrimaryKey @ColumnInfo(name = "id")
让我们举一个基本的例子 用于存储用户的表 @Entity (tableName="users") class UsersEntity( @PrimaryKey val id var
想确认是否可以将实体 bean 绑定(bind)到表的部分列? 例子: 表“A”有列 id, col1, col2, col3, col4, col5, ... , col10 但是我只需要 id、c
问题 双向数据绑定(bind)允许您使用来自对象的数据自动填充 UI 组件,然后在用户编辑这些 UI 组件时自动更新对象。 当用户编辑 UI 组件时,有没有办法不仅自动更新内存中的对象,而且自动更新/
我在 Android Room 中使用可观察查询来触发更新,最终在底层数据发生变化时改变 UI。 有时这些查询涉及多个表,有时用户执行将新值插入到这些表中的操作。插入通常一个接一个地快速完成(即在不到
我想知道点击新房间后如何离开房间 我的页面是这样的。 左侧列表来自MySQL服务器,它获取我的聊天列表。每个房间名称都有 id 值,即房间名称。并且它还有onclick函数可以在客户端使用函数。 当我
我正在尝试将此模块化项目升级到最新的依赖项,但 gradle 构建失败并显示 could not resolve androidx.room:room-runtime:2.4.2我已经包含了maven
在使用 Kotlin Coroutines Flow、Room 和 Live Data 时,我面临着一个非常奇怪的行为。每当我关闭我的设备大约 5-10 秒然后重新打开它时,协程流程就会重新运行而没有
我正在与一位同事讨论我们部署的一款软件遇到的问题,他提到这与一段时间内预订房间的概念问题有何相似之处,算法应该输出房间需要最少开关的预订(因此,例如,最佳解决方案可能是在一个房间停留 3 天,其余时间
如何使用 Room Persistence 库“创建触发器” CREATE TRIGGER IF NOT EXISTS delete_till_10 INSERT ON user WHEN (sel
你如何在 Android Room 中使用 List 的 我有一个表实体,我想通过 Android Room 将其保存在我的 SQLDatabase 中。我已经按照我在网上可以做得很好的一切,并且没有
我正在研究可以在图像上绘制矩形的东西。它工作得很好,因为 JavaFX 很容易,但我遇到了一个我似乎不理解的小问题。 我一直使用 for (object b : ArrayList) ,但从未发生过这
我对java完全陌生。我花了几个小时寻找这个问题的解决方案,但每个答案都涉及传递参数或使用 void,但在这种情况下我不会这样做。 我有两个 java 文件,一个用于 Room 类,一个用于 Tour
我正在创建一个聊天网站,我正在使用 Strophe.js 和 Strophe.muc.js 插件。单人聊天功能运行良好,但我也不想实现群聊功能,用户可以在其中创建房间并邀请其他用户加入他们的房间。使用
按照教程设置 Room 持久性库时,我在 Android 设备上进行测试时遇到了这个错误。 java.lang.RuntimeException:找不到 PackageName.AppDatabase
我是一名优秀的程序员,十分优秀!