最近尝试将项目重构为基于Android Archicture Components的MVVM架构,数据库用的是ObjectBox,就考虑将LiveData与ObjectBox结合,根据官方文档的指引,我们可以通过类似如下代码将两者结合:
在数据库发生变化时,可以通过观察LiveData接收到通知。但是随之也带来问题,就是查询参数发生变化时,如上述代码中,city参数发生变化时,没有触发通知,这就需要到ObjectBoxLiveData类中看一下具体的实现:
可以看到ObjectBoxLiveData事实上是通过传入Query,观察Query数据的变化,再触发LiveData的通知,相当于是做了一个通知的代理。 所以我们继续看Query的observer方法:
在其注释中写到,是订阅了publisher,我们继续到Query的publisher的publish方法中看一下:
这下就很明确了,publish方法重新执行了查询并触发了通知。 所以我们需要在创建ObjectBoxLiveData时保存Query,在查询参数发生变化时,主动调用Query的publish方法来触发重新查询并通知。 但是虽然这样触发了通知,但是查询的结果没有根据查询参数的变化发生改变,原来Query只是在build时构建了一次查询条件,我们需要调用 Query的setParameter方法来改变查询参数,所以查询参数变化触发通知应该是如下的方式: