gpt4 book ai didi

android-room - 当多个表发生更改时,防止 Room Observable 查询多次触发

转载 作者:行者123 更新时间:2023-12-03 08:42:29 30 4
gpt4 key购买 nike

我在 Android Room 中使用可观察查询来触发更新,最终在底层数据发生变化时改变 UI。

有时这些查询涉及多个表,有时用户执行将新值插入到这些表中的操作。插入通常一个接一个地快速完成(即在不到二分之一秒的时间跨度内)

目前,从 Room 订阅更新的观察者将被触发 x 次,其中 x 是查询中已更新的表的数量。

因此,如果值在一秒内插入到查询中的六个不同表中,则任何观察该查询的观察者都会触发六次。

有没有办法告诉Room; “每秒最多触发观察者一次”?或者,更好的是“当您看到更新时,等待半秒以收集任何其他更新,然后立即通知观察者所有内容”?

这是房间查询。正如您所看到的,涉及多个表。

 @Query("SELECT Distinct order_material.* FROM order_material" +
" JOIN orders on order_material.orderId = orders.id" +
" JOIN assignment on order_material.id = assignment.orderMaterialID" +
" JOIN box_inside on assignment.boxInsideID = box_inside.id" +
" WHERE orders.isActive = 1 " +
" AND (box_inside.dateCFOrigPacked <= :dateLimitYema OR box_inside.stemLength IS NOT NULL)" +
" AND assignment.id IN (SELECT id FROM assignment WHERE active = 1" +
" AND quantity > 0 AND assignment.id NOT IN "+
" (Select assignmentID FROM " +
" (Select assignmentID, assignment.quantity as sum_assign, SUM(preparation.quantityPrepared) as sum_prep " +
" from preparation " +
" JOIN assignment on preparation.assignmentID = assignment.id" +
" GROUP BY preparation.assignmentID " +
" HAVING sum_assign <= sum_prep)))" +
" Order By order_material.deliveryDate ASC")
Observable<OrderMaterial[]> getOrderMaterialsReadyToPrepareAsync(Date dateLimitYema);

这是一个观察查询的存储库方法。它被触发 X 次,其中 X 是在很短的时间内更新的表的数量。

 public Observable<List<OrderMaterial>> findOrderMaterialsReadyToPrepareAsync(){
int daysInOneWeek = 7;
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, -1 * daysInOneWeek);
Date limitOneWeekYemas = calendar.getTime();

return Observable.create(subscribe ->
assignmentDao.getOrderMaterialsReadyToPrepareAsync(limitOneWeekYemas)
.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io())
.subscribe(new Observer<OrderMaterial[]>() {
@Override
public void onSubscribe(Disposable d) {
Timber.v("findOrderMaterialsReadyToPrepareAsync on subscribe");
subscribe.setDisposable(d);
preparationDisposable.add(d);
}

@Override
public void onNext(OrderMaterial[] materials) {
// Timber.v("findOrderMaterialsReadyToPrepareAsync onNext with %s", Arrays.toString(materials));
subscribe.onNext(Arrays.asList(materials));
}

@Override
public void onError(Throwable e) {
Timber.e(e,"findOrderMaterialsReadyToPrepareAsync onError");
subscribe.onError(e);
}

@Override
public void onComplete() {
Timber.e("findOrderMaterialsReadyToPrepareAsync onComplete");
}
})
);
}

最佳答案

Is there a way to tell Room; "Only trigger observers a maximum of once every second"? Or, better yet "When you see an update, wait half a second to collect any other updates, and then notify observers of everything at once"?

据我所知,没有这样的方式与 Room 进行通信。 Room 中的可观察查询(使用 LiveData、RxJava、Flow)在后台调用 DB's InvalidationTracker 的使用(这就像一个简单的任何更改触发器):

Adds the given observer to the observers list and it will be notified if any table it observes changes.

更重要的是,即使您观察(使用一个可观察对象)带有某些条件(例如 select * from users where id =:id)的查询,您也会在每个表更改后收到通知,甚至如果具有此特定 ID 的表行没有变化。

您可以尝试添加@Transaction您的查询(仅获得一次触发),但我想这不会有帮助。

所以我认为你不应该对 Room 在这方面期望太多。那么 RxJava 如果你使用它 - 是你期待这种智能“对话”的第一个候选者(可能是 debounce 运算符将是你的选择)。

关于android-room - 当多个表发生更改时,防止 Room Observable 查询多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62338099/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com