【发布时间】:2021-08-05 16:59:18
【问题描述】:
上下文
我正在开发一个离线的第一个应用程序,我基本上是在一个应该显示商店优惠列表的屏幕上工作 - 折扣、优惠券等 - 我正在尝试依赖 Realm 查询通过 Flowables 来获取数据,我希望该应用程序对我们在 Realm DB 上拥有的内容 100% 诚实。我的意思是,如果数据库发生变化,应用程序应该立即刷新 UI,这就是我使用 Flowables 的原因。
问题
到目前为止,这种方法运行良好,但我偶然发现了这种情况有点棘手。我需要像这样显示这个商店优惠列表:
private val offersFlowable: Flowable<RealmResults<RealmOffer>>
get() {
val realm = Realm.getDefaultInstance()
return realm.where(RealmOffer::class.java)
.equalTo("userId", CredentialManager.getInstance().getUserId())
.and()
.beginGroup()
.isNotNull("expiryDate").and().greaterThan("expiryDate", Date())
.endGroup()
.findAll()
.asFlowable()
}
查询本身完美运行,我获取尚未过期的用户优惠。唯一的问题是似乎每次我想刷新数据时都需要重新创建这个查询。为什么?因为Date()。我打开呈现此RecyclerView 商店优惠列表的Activity,我实例化查询并开始监听更改 - 到目前为止一切都很好 - 但如果我有一个即将在大约一分钟内到期的商店优惠,等待整整一分钟,然后执行 Pull To Refresh,过期优惠不会消失。同样,因为Date(),因为当前日期是在一分钟前实例化的,并且仍然是那个日期。
如果我终止应用程序或从头开始实例化 Activity,一切都会按预期进行,因为我再次实例化查询,因此获得了最新的 Date()。
到目前为止我所做的尝试
-
而不是在那里硬编码
Date()arg,在我的ViewModel中有一个currentDate属性 - 这个 Flowable 生活的地方 - 我有点希望如果日期 arg 是对 计算的引用 Kotlin 属性可以解决问题,但它不起作用。 -
与上面相同,但我将
expiryDate字段更改为 millis 而不是Date。
解决方法
因此,现在唯一可行的方法是每次执行 PTR 时重新实例化 Flowable 查询,这样我就可以传递一个最新的 Date() arg 并且查询按预期工作。
我的问题
有什么方法可以解决这个问题,而不必一直重新实例化查询?
谢谢!感谢所有反馈! ????
【问题讨论】: