【问题标题】:realm save objects but don't retrieve it on other thread?领域保存对象但不在其他线程上检索它?
【发布时间】:2019-07-02 09:06:36
【问题描述】:

Realm Version : 5.11.0 Kotlin vesion : 1.3.31

minSdkVersion 21 targetSdkVersion 28 compileSdkVersion 28

继续问题

在领域数据库中插入对象,在此上下文中很好地显示它们,但再次运行同一类后无法获得相同的结果

我尝试了什么

在我的交易失败后刷新或关闭领域

ContactObserver 是后台类,它的工作是同步联系人,它 扩展:ContentObserver

给我看代码!!

在我们想要声明我们的联系人之前,让我们显示 要断言的联系人:

Log.i("okhttp","assert contact : " + Realm.getDefaultInstance().where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size) 
/*
It will log : 453 contacts to assert

Now we give all these contacts as input to graphQl request,

On GraphQl response, we open transaction a big transaction and for each contact asserted and we display again the number of total contacts
to assert :
*/

Realm.getDefaultInstance().executeTransaction {

// delete and insert contactStatus with data 

contactStatus.deleteFromRealm()
it.insertOrUpdate(ContactStatus(data.contact, true,false,false,false))

// and we log among of contacts to assert after this
Log.i("okhttp"," assert : " + Realm.getDefaultInstance().where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size)

// in each value of foreach, we saw the total value descreasing 

/*

I/okhttp:  assert : 452
I/okhttp:  assert : 451
I/okhttp:  assert : 450
I/okhttp:  assert : 449
I/okhttp:  assert : 448
I/okhttp:  assert : 447
I/okhttp:  assert : 446
I/okhttp:  assert : 445
I/okhttp:  assert : 444
I/okhttp:  assert : 443
I/okhttp:  assert : 442
I/okhttp:  assert : 441
I/okhttp:  assert : 440
    ...
I/okhttp:  assert : 14


*/

}

// then we close the default instance
Realm.getDefaultInstance().close()


// Now when we launch again this class, final result should be 14 contacts to assert

Log.i("okhttp","assert contact : " + Realm.getDefaultInstance().where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size)

// But it displays again 453, here is the issue, it should display 14 

目标

在领域数据库中正确插入对象一次并显示总大小

实际结果

在某些上下文中,当我们记录它们时,对象似乎被保存了,但在我们更改上下文时,它不会保存任何东西

编辑

经过一些修改,问题可能是由于 grahQl RxJava 后台线程造成的?

这是我正在使用的完整代码,当我在应用程序的主线程上显示它时,它没有正确保存领域上的数据:

    NvGraphQLClient.createService(ContactService::class.java).assertContact(builder)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe(object : DisposableObserver<GraphContainer<SingleResponse<AssertContact>>>() {

                        override fun onComplete() {

                            val r = Realm.getDefaultInstance()

                            r.refresh()

                            if (r.where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size > 0) {
                                Log.i("okhttp", "complete assert : " + r.where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size)
                                assertContact()
                                r.refresh()
                            }
                            else {
                                r.refresh()
                                Log.i("okhttp", "complete assert : " + r.where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size)
                            }
                            r.close()
                        }

                        override fun onNext(response: GraphContainer<SingleResponse<AssertContact>>) {


                            if (response.data.item != null) {

                                val assertsData = response.data.item.assertData

                                val r = Realm.getDefaultInstance()

                                r.executeTransaction {

                                    assertsData?.forEach { data ->
                                        if ((data.assert == 0) || (data.assert == 2)) {

                                                    contactStatus.deleteFromRealm()
                                                    it.insertOrUpdate(ContactStatus(data.contact, true,false,false,false))
                                                    Log.i("okhttp"," assert after compute : " + Realm.getDefaultInstance().where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size)
                                                }
                                                else {
                                                    Log.i("okhttp", "contact null" + data.contact.toString())
                                                }

                                            }
                                            else
                                                Log.i("okhttp", "mid null" + data.contact?.mid)
                                        }
                                    }
                                }
                                r.refresh()
                            }

                        }

                        override fun onError(e: Throwable) {
                            Log.e("okhttp", e.message)
                        }
                    })

也许问题可能是由于 graphQl 后台工作?

这里是经过一些修改的完整代码:

  NvGraphQLClient.createService(ContactService::class.java).assertContact(builder)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(object : DisposableObserver<GraphContainer<SingleResponse<AssertContact>>>() {

                    override fun onComplete() {

                        val r = Realm.getDefaultInstance()

                        r.refresh()

                        if (r.where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size > 0) {
                            Log.i("okhttp", "complete assert : " + r.where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size)
                            assertContact()
                            r.refresh()
                        }
                        else {
                            r.refresh()
                            Log.i("okhttp", "complete assert : " + r.where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size)
                        }
                        r.close()
                    }

                    override fun onNext(response: GraphContainer<SingleResponse<AssertContact>>) {


                        if (response.data.item != null) {

                            val assertsData = response.data.item.assertData

                            val r = Realm.getDefaultInstance()

                            r.executeTransaction {

                                assertsData?.forEach { data ->
                                    if ((data.assert == 0) || (data.assert == 2)) {

                                                contactStatus.deleteFromRealm()
                                                it.insertOrUpdate(ContactStatus(data.contact, true,false,false,false))
                                                Log.i("okhttp"," assert after compute : " + Realm.getDefaultInstance().where(ContactStatus::class.java).equalTo("toAssert", true).findAll().size)
                                            }
                                            else {
                                                Log.i("okhttp", "contact null" + data.contact.toString())
                                            }

                                        }
                                        else
                                            Log.i("okhttp", "mid null" + data.contact?.mid)
                                    }
                                }
                            }
                            r.refresh()
                        }

                    }

                    override fun onError(e: Throwable) {
                        Log.e("okhttp", e.message)
                    }
                })

我仅在 Android 8 设备上注意到此问题,但无法在 Android 9 上重现,在 Android 9 上它运行良好

我也修改了我的 ContentObserver 类,也许我在此上下文中执行领域时遇到了一些问题,所以我再次写了我的请求,但在常规活动(我的 HomeActivity)中,所以当我启动我的函数来断言时,一切似乎工作得很好,当我再次运行我的函数时我有相同的值,直到我完成保存数据,但是当我再次启动我的应用程序时,我丢失了保存在领域中的所有数据,我必须从一开始就再次运行我的断言.. .

我也试过了:

  • 使用 Subscribers.newThread() 而不是 Subscribers.io() 没有成功,与这个问题有关:

Realm data sync not consistent

  • 在我从基础读取或写入之前和之后刷新领域没有成功

  • 在使用后处理关闭的领域实例,即使它应该在我启动执行事务(执行后自动关闭)时支持但没有成功

【问题讨论】:

    标签: android realm


    【解决方案1】:

    最后不是因为领域,我的代码在执行时自动创建了新元素,所以这是固定的

    【讨论】:

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