- 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/
我正在开发一些用于计费的数据库项目(PHP/MySQL)。 每当创建新账单时,我想生成一个由年、周和增量编号组成的账单编号。我想用触发器来做到这一点。触发器将使用现有的账单编号来查找增量编号,或者从新
我有一个 MySQL 插入,我正在使用 RAND 生成随机 INT 值问题是它不会插入到数据库中,因为该列接受 TINYINT ,如何将输出转换为 TINYINT。代码示例如下: INSERT INT
如果我想从单个插入中保存主键 (mytable_id),我已完成以下操作: CREATE OR REPLACE FUNCTION myfunct(ownerid text) RETURNS void
为了简单起见,假设我有两个表 用户表(id,email) 用户日志表(id, date) 无论 id 被插入到 user 表中,相同的 id 也应该被插入到 user_log 表中,否则事务应该失败。
为了简单起见,假设我有两个表 用户表(id,email) 用户日志表(id, date) 无论 id 被插入到 user 表中,相同的 id 也应该被插入到 user_log 表中,否则事务应该失败。
我知道在触发器中 - 至少对于 SQL Server - 人们永远不应该假设插入的表只有一行,这意味着触发器中这样的 SQL 通常是不好的: select @UserID = ID from inse
我正在使用 bigquery 对象中的方法 tabledata().insertAll 更新行列表。执行后,返回显示没有错误。但是,我的表仍然继续,没有写入任何数据。 可能是权限问题。如果是这样,为什
这是一个扩展 F# Recursive Tree Validation 的问题,我昨天已经很好地回答了。 这个问题涉及在现有树中插入一个 child 。这是我想使用的更新类型: type Name
我有 2 个表:用户和照片(在 mysql 数据库中)。 在这里你可以看到两个表之间的关系 User Photos -------------
我试图同时在不同的表上插入两行。 子查询INSERT INTO的AUTO_INCRMENT或id的值(如果已经存在)应该写入主查询中。 目前我有这个(仅用 3 个值简化),但它不起作用。我想知道是否有
我有一个 900 万行的表,由于其庞大的规模,我正在努力处理所有这些数据。 我想做的是在不覆盖数据的情况下将 IMPORT 一个 CSV 添加到表中。 在我做这样的事情之前; INSERT if no
我正在写新闻并将其插入到我的数据库中,我在 3 年前构建了代码并且运行良好,但我不能再插入了,我不明白为什么: $insert=mysqli_query($co,"INSERT INTO articl
我正在尝试编写一个简单的 INSERT 语句来将新用户添加到数据库中,但它不起作用,这意味着,我尝试插入到表中的数据都没有被插入。几个小时以来,我一直在尝试解决此问题,但没有成功。我尝试编写插入语句的
所以我有这个表格: http://i.imgur.com/vZYssQy.png 现在 ID、First Name、Last Name、DOB、Address、Phone Number 和 Post
在控制台中运行查询(SELECT 语句)时,从数据库检索到的数据以表格格式显示在数据库控制台工具窗口的结果 Pane 中。 我已经搜索过 datagrip Help我只是想知道是否有任何方法可以用于为
每当使用触发器插入行时,我都试图将另一行插入表中,但收到以下错误消息: The target table 'EDDSDBO.Redaction' of the DML statement cannot
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 6 年前。 Improve
我有以下代码片段: $get_data = mysqli_query ($connect, "SELECT * FROM users WHERE username = '$username'");
情况:需要向 SQLite 数据库中插入大量数据。 问题:我们可以使用两个语句来插入数据 - data = [("111", "222", "333"), ("AAA", "BBB", "CCC"),
我的数据库中有一个表 Teacher: TABLE Teacher ( ID CHAR (7) NOT NULL , name
我是一名优秀的程序员,十分优秀!