【发布时间】: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
在我从基础读取或写入之前和之后刷新领域没有成功
在使用后处理关闭的领域实例,即使它应该在我启动执行事务(执行后自动关闭)时支持但没有成功
【问题讨论】: