boblinux
boblinux

Reputation: 105

realm save objects but don't retrieve it on other thread?

Realm Version : 5.11.0 Kotlin vesion : 1.3.31

minSdkVersion 21 targetSdkVersion 28 compileSdkVersion 28

Resume the problem

insert objects on realm database, displaying them well in this context but and can't get same result after run again the same class

What i tried

refresh or close realm after my transaction without success

ContactObserver is background class, it job is to synchronize contacts, and it extends : ContentObserver

Show me code !!

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 

Goal

insert objects on realm database properly once and display total size

Actual Results

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

EDIT

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)
                        }
                    })

maybe issue can be due to graphQl background working ?

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...

What i tried too :

Realm data sync not consistent

Upvotes: 0

Views: 542

Answers (1)

boblinux
boblinux

Reputation: 105

Finally it wasn't due to realm, my code created new elements at execution automatically, so this is fixed

Upvotes: 0

Related Questions