Remove old challenges from local db. Fixes #834

This commit is contained in:
Phillip Thelen 2017-10-31 11:33:37 +01:00
parent 256518a9c7
commit 176cc7d0ee
3 changed files with 22 additions and 3 deletions

View file

@ -120,7 +120,7 @@ public class ChallengeRepositoryImpl extends BaseRepositoryImpl<ChallengeLocalRe
@Override
public Observable<List<Challenge>> retrieveChallenges(User user) {
return apiClient.getUserChallenges()
.doOnNext(localRepository::save);
.doOnNext(localRepository::saveChallenges);
}
@Override

View file

@ -20,4 +20,6 @@ public interface ChallengeLocalRepository extends BaseLocalRepository {
Observable<RealmResults<Challenge>> getUserChallenges(String userId);
void setParticipating(Challenge challenge, boolean isParticipating);
void saveChallenges(List<Challenge> challenges);
}

View file

@ -2,12 +2,12 @@ package com.habitrpg.android.habitica.data.local.implementation;
import com.habitrpg.android.habitica.data.local.ChallengeLocalRepository;
import com.habitrpg.android.habitica.models.social.Challenge;
import com.habitrpg.android.habitica.models.social.Group;
import com.habitrpg.android.habitica.models.tasks.Task;
import com.habitrpg.android.habitica.models.user.User;
import java.util.ArrayList;
import java.util.List;
import io.realm.OrderedRealmCollectionSnapshot;
import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.Sort;
@ -57,4 +57,21 @@ public class RealmChallengeLocalRepository extends RealmBaseLocalRepository impl
public void setParticipating(Challenge challenge, boolean isParticipating) {
realm.executeTransaction(realm1 -> challenge.isParticipating = isParticipating);
}
@Override
public void saveChallenges(List<Challenge> onlineChallenges) {
OrderedRealmCollectionSnapshot<Challenge> localChallenges = realm.where(Challenge.class).findAll().createSnapshot();
List<Challenge> challengesToDelete = new ArrayList<>();
for (Challenge localTask : localChallenges) {
if (!onlineChallenges.contains(localTask)) {
challengesToDelete.add(localTask);
}
}
realm.executeTransaction(realm1 -> {
for (Challenge localTask : challengesToDelete) {
localTask.deleteFromRealm();
}
});
realm.executeTransaction(realm1 -> realm1.insertOrUpdate(onlineChallenges));
}
}