可观察查询的Realm实例由另一个查询

时间:2018-01-04 09:31:26

标签: android realm

我的领域我的领域实例存在问题。我只使用领域默认实例。对于每个查询/更新操作,我使用Realm.getDefaultInstance()获取一个领域实例,并在完成操作时关闭它。

我的问题是其中一个查询是一个可观察的查询。我只在订阅完成时关闭此领域实例。同时,其他操作可以关闭其领域实例。我知道领域实例是从缓存中获取的,所以我认为其中一个操作正在关闭我在创建可观察查询时获得的同一个领域实例,因为在一些操作之后,我的可观察查询会停止发送项目,当我完成我的订阅,我得到一个例外,说我的领域实例已经关闭。它有意义吗?怎么能避免这种情况?

我认为这就是发生的事情:

1. Start observable query -> Realm observable instance opened
2. Start database update 1 -> Realm query1 instance opened
3. Finish database update 1 -> Realm query1 instance closed

...

4. Start database update X -> Realm observable instace opened again <- PROBLEM
5. Finish database update X -> Realm observable instance closed
6. Finish observable query -> Realm observable instance closed again -> EXCEPTION

这是我执行可观察查询的代码:

Realm realm = Realm.getDefaultInstance();

return realm.where(Message.class)
        .findAll().asObservable()
        .filter(RealmResults::isLoaded)
        .map(realm::copyFromRealm)
        .doOnUnsubscribe(() -> realm.close());

有没有办法获得一个没有缓存的全新领域实例,以便没有人可以获得引用并关闭它?

1 个答案:

答案 0 :(得分:0)

实际上,Realm的Rx集成使用RealmResults的RealmConfiguration来内部增加Realm ref-count(在Observable中),所以你不需要做这样的魔术。你可以这样做:

try(Realm realm = realm.getDefaultInstance()) {
    return realm.where(Message.class)
        .findAll()
        .asObservable() // synchronous query is always loaded
        .map(realm::copyFromRealm)
}

它起作用了。虽然我不确定它是否有助于解决您的问题。