领域保存对象,但不在其他线程上检索它?

时间:2019-07-02 09:06:36

标签: android realm

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

  • 从基础读写之前和之后刷新领域

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

1 个答案:

答案 0 :(得分:0)

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