上下文
我正在开发一个离线的第一个应用程序,我基本上是在开发一个屏幕,它应该显示商店提供的一系列服务--折扣、优惠券,诸如此类的东西--我正试图通过Flowables来获取数据,并且我希望这个应用程序对我们在领域DB上所拥有的内容保持百分之百的诚实。我的意思是,如果数据库中有什么变化,应用程序应该立即刷新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()。我打开呈现这个存储提供列表的Activity,实例化查询并开始侦听更改--到目前为止--但是如果我有一个马上就要过期的商店报价,请等待整整一分钟,然后按一下刷新,过期的优惠就不会消失。同样,由于Date(),因为当前日期是一分钟前实例化的,而且它仍然是那个日期。
如果我从零开始终止应用程序或实例化Activity,那么一切都会按预期的方式工作,因为我再次实例化了查询,从而获得了最新的Date()。
我到目前为止尝试过的
Date() arg,在我的ViewModel中有一个currentDate属性--这个流动的生活的地方--我有点希望如果日期arg是对计算的Kotlin属性的引用,那么就可以做到这一点,但是它不起作用。Date.与
expiryDate字段改为millis,而不是expiryDate解决方案--
所以,现在唯一起作用的就是每次执行PTR时重新实例化可流动的查询,这样我就传递了最新的Date() arg,查询就像预期的那样工作。
我的问题
是否有任何方法可以修复这个问题,而不必一直重新实例化查询?
谢谢!感谢所有反馈!
发布于 2021-08-17 10:03:18
我希望我已经正确地理解了你的问题,我想提出一个建议,也许会对你有所帮助。当前的工作肯定不是一个好的选择,因为一次又一次地请求数据库。所以在我看来,在这种情况下,
在RecyclerView上呈现数据之前,执行以下操作;
1-获取每个项目的到期日和时间。
2-获取当前日期和时间。
3-将两者进行比较,得出两者的差异。
现在,如果差异是-ve值,它意味着该项过期了,您不必在recyclerView中显示它。当然,这个项目在ArrayList/List中是可用的,但是它不在recyclerView上呈现。
,否则是第二个选项
在添加存储向数据库提供数据时,只需为每个报价注册一个PendingIntent和一个AlarmManager,并将Expriy-time设置为PendingIntent的警报时间。
这样,当要约到期时,它就会发出警报。所以,在这里你可以做魔术,当PendingIntent得到触发器,只需更新您的数据库和回收视图从那里。这样你就可以自动处理每一个报价。
如果有帮助请告诉我。
快乐编码:)
https://stackoverflow.com/questions/68670734
复制相似问题