Tenzing Sherpa
Tenzing Sherpa

Reputation: 27

Storing Data using Realm with Retrofit and RxJava

can anyone provide me a good example of saving the data to Realm Database using Retrofit and RxJava? Thank you.

Upvotes: 0

Views: 689

Answers (1)

EpicPandaForce
EpicPandaForce

Reputation: 81588

Create Subscription that downloads data via Retrofit Service and persists to the Realm

    Subscription downloadCats = Observable.create(new RecyclerViewScrollBottomOnSubscribe(recyclerView))
            .filter(isScroll -> isScroll || realm.where(Cat.class).count() <= 0)
            .switchMap(isScroll -> catService.getCats().subscribeOn(Schedulers.io())) //
            .retry()
            .subscribe(catsBO -> {
                catPersister.persist(catsBO);
            }, throwable -> {
                Log.e(TAG, "An error occurred", throwable);
            });
    compositeSubscription.add(downloadCats);

Where you persist the objects into the Realm like this

try(Realm r = Realm.getDefaultInstance()) { // on background thread
    r.executeTransaction((realm) -> {
        Cat defaultCat = new Cat();
        long rank;
        if(realm.where(Cat.class).count() > 0) {
            rank = realm.where(Cat.class).max(CatFields.RANK).longValue();
        } else {
            rank = 0;
        }
        for(CatBO catBO : catsBO.getCats()) {
            defaultCat.setId(catBO.getId());
            defaultCat.setRank(++rank);
            defaultCat.setSourceUrl(catBO.getSourceUrl());
            defaultCat.setUrl(catBO.getUrl());
            realm.insertOrUpdate(defaultCat);
        }
    });
}

And display the data and be kept up to date on your UI thread with either

  • RealmRecyclerViewAdapter
  • or another Subscription via realm.where(Cat.class).findAllSortedAsync(...).asObservable().filter(RealmResults::isLoaded).subscribe():

    recyclerView.setAdapter(new CatAdapter(getContext(),
            realm.where(Cat.class).findAllSortedAsync(CatFields.RANK, Sort.ASCENDING)));

    return RxTextView.textChanges(editText).switchMap(charSequence -> 
          realm.where(Dog.class)
                    .contains(DogFields.NAME, charSequence.toString())
                    .findAllAsync()
                    .asObservable()
    ).filter(RealmResults::isLoaded) 
     .subscribe(dogs -> {
          adapter.updateData(dogs);
     });

Upvotes: 2

Related Questions