Android Kotlin Realm正确查询方式+返回Bg线程上的非托管项

时间:2016-08-16 18:11:35

标签: android realm kotlin

使用领域查询和返回项目的非托管结果的正确方法是什么,后台线程中的所有内容?我正在使用像这样的somethibf:

return Observable.just(1)
                .subscribeOn(Schedulers.io())
                .map {
                    val realm = Realm.getDefaultInstance()
                    val results = realm.where(ItemRealm::class.java)
                            .equalTo("sent", false).findAll()

                    realm to results
                }
                .map {
                    val (realm, results) = it
                    val unManagedResults = realm.copyFromRealm(results)
                    realm.close()
                    unManagedResults
                }
    }

然后用另一个将结果发布到服务器上来链接这个observable。

解决方案有效,虽然在这方面有点难看:

  • 没有正确的方法将realmQuery包装在一个observable中,因为 没有这种欺骗(至少我知道的),没有办法在后台线程中打开realInstance,所以我需要使用这个假的 可观察的Observable.just(1)
  • 在第一张和第二张地图中,不是打开和关闭Realm实例的最佳位置

  • 我不知道是否保证在复制完所有项目后关闭领域实例。

那么在后台线程上查询和返回非托管结果的正确方法是什么(某些上下文,我需要将结果发送到服务器,在后台,因为此任务完全独立于我的app当前数据流,所以它应该脱离主线程。)

推荐版本:

return Observable.fromCallable {
            Realm.getDefaultInstance().use { realm ->
                realm.copyFromRealm(
                        realm.where(ItemRealm::class.java)
                                .equalTo(ItemRealm.FIELD_SEND, false).findAll()
                )
            }
        }

1 个答案:

答案 0 :(得分:1)

这就是你如何将你的Realm对象解除管理:

    return Observable.defer(() -> {
        try(Realm realm = Realm.getDefaultInstance()) {
            return Observable.just(
                realm.copyFromRealm(
                    realm.where(ItemRealm.class).equalTo("sent", false).findAll()
                )
            );
        }
    }).subscribeOn(Schedulers.io());

虽然这个答案是Java,但Kotlin的答案只有半步之遥。