Reputation: 27
can anyone provide me a good example of saving the data to Realm Database using Retrofit and RxJava? Thank you.
Upvotes: 0
Views: 689
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
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