我用RxJava观察数据库表。所有SQL SELECT查询都返回一个热的observable,每当我在同一个表中INSERT / UPDATE / DELETE行时,我将重新运行任何订阅的SELECT查询并在热查询observable上调用onNext(queryResult)
。
database.select("SELECT * FROM Foo) // returns an observable
.map(doSomething)
.filter(aFilter)
.subscribe (
{
// onNext
},
{
// onError
}
)
这很有效。但是,在一个特殊用例中,我想避免数据库重新发出新项目。是否有某种操作员可以使用它来使它成为一个“冷”的#34; observable,而不必更改我为这样的热观察器构建的所有数据库层:
database.select("SELECT * FROM Foo) // returns an observable
.map(doSomething)
.filter(aFilter)
.toColdObservable()
.subscribe (
{
// onNext
},
{
// onError
}
)
我知道"冷可观察"这不是正确的词,但我找不到更好的名字。所以我想要的是数据库不会通知SQL Query Observable更新。所以我的意思是"冷可观察"只是一次查询数据库,之后再也没有收到更新。
答案 0 :(得分:4)
简单take(1)
怎么样?这将在第一次结果后完成您的查询可观察。
答案 1 :(得分:1)
如果您不想要通知,可以使用空subscribe,这会有效地忽略结果:
订阅Observable但忽略其排放和通知。
database.select("SELECT * FROM Foo") // returns an observable
.map(doSomething)
.filter(aFilter)
.subscribe ()
答案 2 :(得分:1)
有两种主要方法可以将热点可观察量转换为冷点:defer
完全推迟存在或replay
+ autoConnect(0)
预先运行它并只重放给其他人冷酷的。
但是,此select
的通知方案意味着它不会完成,因此您需要应用某种timeout
,以便重播的大小有限。
我还会检查库是否实际上支持一次性运行(冷)查询,而你没有这个问题;每个订阅者将运行一个新的有限查询。否则,这可能是一个不错的功能请求。