package com.example.lengary_l.wanandroid.data.source.local; import android.support.annotation.NonNull; import com.example.lengary_l.wanandroid.data.ArticleDetailData; import com.example.lengary_l.wanandroid.data.ReadLaterArticleData; import com.example.lengary_l.wanandroid.data.source.ReadLaterArticlesDataSource; import com.example.lengary_l.wanandroid.realm.RealmHelper; import java.util.Comparator; import java.util.List; import io.reactivex.Observable; import io.realm.Realm; import io.realm.RealmResults; /** * Created by CoderLengary */ public class ReadLaterArticlesLocalSource implements ReadLaterArticlesDataSource { private static ReadLaterArticlesLocalSource INSTANCE; private ReadLaterArticlesLocalSource() { } public static ReadLaterArticlesDataSource getInstance() { if (INSTANCE == null) { synchronized (ReadLaterArticlesDataSource.class) { if (INSTANCE == null) { INSTANCE = new ReadLaterArticlesLocalSource(); } } } return INSTANCE; } @Override public Observable<List<ReadLaterArticleData>> getReadLaterArticles(int userId) { Realm realm = RealmHelper.newRealmInstance(); List<ReadLaterArticleData> datas = realm.copyFromRealm(realm.where(ReadLaterArticleData.class) .equalTo("userId", userId) .findAll()); return Observable.fromIterable(datas).toSortedList(new Comparator<ReadLaterArticleData>() { @Override public int compare(ReadLaterArticleData data, ReadLaterArticleData t1) { if (data.getTimestamp() > t1.getTimestamp()) { return -1; } else { return 1; } } }).toObservable(); } @Override public void insertReadLaterArticle(int userId, int id, long timeStamp) { //Build a new instance of ReadLaterArticleData by the article searched by its id in database of ArticleDetailData // then insert the instance to the database of ReadLaterArticleData Realm realm = RealmHelper.newRealmInstance(); ArticleDetailData articleDetailData = realm.copyFromRealm( realm.where(ArticleDetailData.class) .equalTo("id", id) .findFirst() ); ReadLaterArticleData data = new ReadLaterArticleData(); data.setId(id); data.setTitle(articleDetailData.getTitle()); data.setLink(articleDetailData.getLink()); data.setAuthor(articleDetailData.getAuthor()); data.setChapterId(articleDetailData.getChapterId()); data.setChapterName(articleDetailData.getChapterName()); data.setUserId(userId); data.setTimestamp(timeStamp); realm.beginTransaction(); realm.copyToRealmOrUpdate(data); realm.commitTransaction(); realm.close(); } @Override public void removeReadLaterArticle(int userId, int id) { Realm realm = RealmHelper.newRealmInstance(); ReadLaterArticleData data = realm.where(ReadLaterArticleData.class) .equalTo("userId", userId) .and() .equalTo("id", id) .findFirst(); realm.beginTransaction(); data.deleteFromRealm(); realm.commitTransaction(); realm.close(); } @Override public boolean isExist(int userId, int id) { Realm realm = RealmHelper.newRealmInstance(); RealmResults<ReadLaterArticleData> list = realm.where(ReadLaterArticleData.class) .equalTo("userId", userId) .and() .equalTo("id", id) .findAll(); return !list.isEmpty(); } @Override public void clearAll() { //When we use a different account to login in ,we should delete all the ReadLaterArticleData in realm Realm realm = RealmHelper.newRealmInstance(); RealmResults<ReadLaterArticleData> results = realm.where(ReadLaterArticleData.class).findAll(); realm.beginTransaction(); results.deleteAllFromRealm(); realm.commitTransaction(); realm.close(); } }