Reputation: 105
Realm Version : 5.11.0
Kotlin vesion : 1.3.31
minSdkVersion 21
targetSdkVersion 28
compileSdkVersion 28
insert objects on realm database, displaying them well in this context but and can't get same result after run again the same class
refresh or close realm after my transaction without success
ContactObserver is background class, it job is to synchronize contacts, and it extends : ContentObserver
Before we wanna assert our contacts, let's display number of contacts to assert :
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
insert objects on realm database properly once and display total size
in certain context objects seems to be saved when we log them, but after certain time when we change context it don't save anything
with some modifications, maybe the issue is due to grahQl RxJava background threading ?
here is the full piece of code i'm using, that don't save properly datas on realm when i display it on main thread of application :
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)
}
})
here is the full piece of code with some modifications :
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)
}
})
I noticed this issue only on Android 8 device but can't reproduce on Android 9, on Android 9 its workin well
I modified too my ContentObserver class maybe i had some issue with executing realm on this context, so i write again my request but in a regular activity (my HomeActivity), so when i'm launching my function to assert, all seems working well, i have the same value when a run again my function untill i finish to save datas, but when i launch again my application, i loose all my datas saved on realm, and i have to run again my assert from beggining...
Realm data sync not consistent
Refresh realm before & after my read or write from base without success
Take care of close realm instances after use it, even if it's supposed to be supported when i launch execute transaction (supposed to be closed automatically after execution) without success
Upvotes: 0
Views: 542
Reputation: 105
Finally it wasn't due to realm, my code created new elements at execution automatically, so this is fixed
Upvotes: 0