Correctly delete old local data

This commit is contained in:
Phillip Thelen 2017-05-19 14:15:00 +02:00
parent fead28b8a3
commit 0091a50d59
8 changed files with 82 additions and 12 deletions

View file

@ -51,6 +51,22 @@ public class RealmTaskLocalRepository extends RealmBaseLocalRepository implement
}
if (userId != null) {
removeOldTasks(realm1, userId, sortedTasks);
List<ChecklistItem> allChecklistItems = new ArrayList<>();
for (Task t : sortedTasks) {
if (t.checklist != null) {
allChecklistItems.addAll(t.checklist);
}
}
removeOldChecklists(realm1, allChecklistItems);
List<RemindersItem> allReminders = new ArrayList<>();
for (Task t : sortedTasks) {
if (t.getReminders() != null) {
allReminders.addAll(t.getReminders());
}
}
removeOldReminders(realm1, allReminders);
}
realm1.insertOrUpdate(sortedTasks);
@ -77,8 +93,8 @@ public class RealmTaskLocalRepository extends RealmBaseLocalRepository implement
realm.executeTransaction(realm1 -> realm1.insertOrUpdate(task));
}
private void removeOldTasks(Realm realm1, String userID, List<Task> onlineTaskList) {
RealmResults<Task> localTasks = realm1.where(Task.class).equalTo("userId", userID).findAll();
private void removeOldTasks(Realm realm, String userID, List<Task> onlineTaskList) {
RealmResults<Task> localTasks = realm.where(Task.class).equalTo("userId", userID).findAll();
for (Task localTask : localTasks) {
if (!onlineTaskList.contains(localTask)) {
for (ChecklistItem item : localTask.checklist) {
@ -92,7 +108,23 @@ public class RealmTaskLocalRepository extends RealmBaseLocalRepository implement
}
}
private void removeOldChecklists(Realm realm, List<ChecklistItem> onlineItems) {
RealmResults<ChecklistItem> localItems = realm.where(ChecklistItem.class).findAll();
for (ChecklistItem localItem : localItems) {
if (!onlineItems.contains(localItem)) {
localItem.deleteFromRealm();
}
}
}
private void removeOldReminders(Realm realm, List<RemindersItem> onlineReminders) {
RealmResults<RemindersItem> localReminders = realm.where(RemindersItem.class).findAll();
for (RemindersItem localItem : localReminders) {
if (!onlineReminders.contains(localItem)) {
localItem.deleteFromRealm();
}
}
}
@Override
public void deleteTask(String taskID) {
Task task = realm.where(Task.class).equalTo("id", taskID).findFirstAsync();
@ -100,7 +132,6 @@ public class RealmTaskLocalRepository extends RealmBaseLocalRepository implement
}
@Override
public Observable<Task> getTask(String taskId) {
return realm.where(Task.class).equalTo("id", taskId).findFirstAsync().asObservable()
.filter(realmObject -> realmObject.isLoaded())

View file

@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.data.local.implementation;
import com.habitrpg.android.habitica.data.local.UserLocalRepository;
import com.habitrpg.android.habitica.models.Skill;
import com.habitrpg.android.habitica.models.Tag;
import com.habitrpg.android.habitica.models.TutorialStep;
import com.habitrpg.android.habitica.models.user.SpecialItems;
import com.habitrpg.android.habitica.models.user.User;
@ -32,7 +33,23 @@ public class RealmUserLocalRepository extends RealmBaseLocalRepository implement
@Override
public void saveUser(User user) {
realm.executeTransaction(realm1 -> realm1.insertOrUpdate(user));
realm.executeTransaction(realm1 -> {
realm1.insertOrUpdate(user);
if (user.getTags() != null) {
removeOldTags(user.getId(), user.getTags());
}
});
}
private void removeOldTags(String userId, List<Tag> onlineTags) {
RealmResults<Tag> tags = realm.where(Tag.class).equalTo("userId", userId).findAll();
for (Tag tag : tags) {
if (!onlineTags.contains(tag)) {
tag.deleteFromRealm();
}
}
}
@Override

View file

@ -19,7 +19,7 @@ public class Tag extends RealmObject {
@PrimaryKey
public String id;
public User user;
public String userId;
public RealmList<Task> tasks;
String name;
boolean challenge;

View file

@ -78,4 +78,12 @@ public class ChecklistItem extends RealmObject {
public void setTask(Task task) {
this.task = task;
}
@Override
public boolean equals(Object obj) {
if (obj.getClass().equals(ChecklistItem.class)) {
return this.id.equals(((ChecklistItem)obj).id);
}
return super.equals(obj);
}
}

View file

@ -66,4 +66,12 @@ public class RemindersItem extends RealmObject {
public void setType(String type) {
this.type = type;
}
@Override
public boolean equals(Object obj) {
if (obj.getClass().equals(RemindersItem.class)) {
return this.id.equals(((RemindersItem)obj).id);
}
return super.equals(obj);
}
}

View file

@ -141,7 +141,6 @@ public class PartyFragment extends BaseMainFragment {
}
}, RxErrorHandler.handleEmptyError());
}
}
@Override

View file

@ -20,7 +20,11 @@ public class QuestDeserializer implements JsonDeserializer<Quest> {
JsonObject obj = json.getAsJsonObject();
Quest quest = new Quest();
quest.key = obj.get("key").getAsString();
if (obj.has("key") && !obj.get("key").isJsonNull()) {
quest.key = obj.get("key").getAsString();
} else {
return quest;
}
if (obj.has("active")) {
quest.active = obj.get("active").getAsBoolean();
}
@ -32,7 +36,7 @@ public class QuestDeserializer implements JsonDeserializer<Quest> {
}
if (obj.has("progress")) {
QuestProgress progress = new QuestProgress();
progress.key = obj.get("key").getAsString();
progress.key = quest.getKey();
JsonObject progressObj = obj.get("progress").getAsJsonObject();
if (progressObj.has("hp")) {
progress.hp = progressObj.get("hp").getAsInt();

View file

@ -32,6 +32,10 @@ public class UserDeserializer implements JsonDeserializer<User> {
public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
User user = new User();
JsonObject obj = json.getAsJsonObject();
if (obj.has("_id")) {
user.setId(obj.get("_id").getAsString());
}
if (obj.has("balance")) {
user.setBalance(obj.get("balance").getAsDouble());
}
@ -68,6 +72,9 @@ public class UserDeserializer implements JsonDeserializer<User> {
if (obj.has("tags")) {
user.setTags(context.deserialize(obj.get("tags"), new TypeToken<RealmList<Tag>>() {
}.getType()));
for (Tag tag : user.getTags()) {
tag.userId = user.getId();
}
}
if (obj.has("tasksOrder")) {
user.setTasksOrder(context.deserialize(obj.get("tasksOrder"), TasksOrder.class));
@ -85,10 +92,6 @@ public class UserDeserializer implements JsonDeserializer<User> {
}
}
if (obj.has("_id")) {
user.setId(obj.get("_id").getAsString());
}
return user;
}
}