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)
}
})
这是经过一些修改的完整代码:
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)中,所以当我启动要断言的函数时,一切似乎运行良好,当再次运行我的函数直到完成保存数据时,我具有相同的值,但是当我再次启动我的应用程序时,我释放了保存在领域中的所有数据,并且我必须从头开始再次运行我的断言。
Realm data sync not consistent
从基础读写之前和之后刷新领域
使用它后要小心关闭领域实例,即使我启动执行事务(应该在执行后自动关闭)时应该支持它也没有成功
答案 0 :(得分:0)
最后不是因为领域,我的代码在执行时自动创建了新元素,所以这是固定的