【问题标题】:Realm Count incorrect/inconsistant off Main Thread主线程的领域计数不正确/不一致
【发布时间】:2017-06-20 04:37:11
【问题描述】:

我看到一个非常奇怪的问题,即从不在主线程上运行的查询中获取计数。我有一个使用 Realm 的 RecyclerView 适配器的 UI,而且它的工作原理很花哨。

我有一个方法可以在查询之前计算记录数,因此它可以设置一个起点,由于某种原因,它会返回上次事务之前的上一个计数。这是一个略短的版本,带有日志的输出:

D/SearchController: Query Count (Main Thread): 50
D/SearchController: Query Count (Rx Thread): 50
D/SearchController: Query Count (Main Thread): 100
D/SearchController: Query Count (Rx Thread): 50

public Single<Update> searchWithCriteriaForMore(SearchCriteria searchCriteria) {
        Realm realmI = Realm.getDefaultInstance();
        Timber.d("Query Count (Main Thread): %d", realmI.where(Ad.class).equalTo("searchId", searchCriteria.id()).count());
        realmI.close();
        return Single.defer(() -> {
            Realm realm = Realm.getDefaultInstance();
            Timber.d("Query Count (Rx Thread): %d", realm.where(Ad.class).equalTo("searchId", searchCriteria.id()).count());
            realm.close();
// Stuff to add records on Rx Thread
        });
    }

调用如下所示:

SearchController.instance().searchWithCriteriaForMore(searchCriteria)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new SingleSubscriber<SearchController.Update>() {
        ...
     }

有人想吗?几个星期以来,我一直试图确定这一点,以为这是我正在做的事情,但如果我在主线程上进行计数并将其传递,它工作正常。

我正在运行 RxJava 1.2.7、RxAndroid 1.2.1 和 Realm 3.3.1。

【问题讨论】:

  • 感谢您的想法,我使用的是 minSdk 16,因此无法使用资源想法,但我确实将计数放入事务中,现在它得到了正确的计数。这不应该是必要的,但猜猜这就是生活。
  • 不,实际上,如果您使用 Realm 3.2+,您可以删除事务并在 Realm.getDefaultInstance() 之后将其替换为 realm.refresh()

标签: android realm rx-java


【解决方案1】:

感觉你在 RxThread 上有一个 Realm 实例,之前没有关闭。由于 RxThread 没有循环器,因此无法自动更新领域实例。所以它被锁定在创建时的版本。

Realm 在内部使用 ref 计数器,getDefaultInstance() 只会返回您之前在 RxThread 上打开的相同实例。

解决办法: 1. 找出 RxThread 上检索到的 Realm 实例并正确关闭它。所以下次getDefaultInstance() 将返回一个最新版本数据的新Realm 实例。 2.如果打算在RxThread上有Realm实例,可以调用realm.refresh()手动移动到最新数据版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多