package com.pedrocarrillo.expensetracker.utils; import com.pedrocarrillo.expensetracker.ExpenseTrackerApp; import com.pedrocarrillo.expensetracker.entities.Category; import com.pedrocarrillo.expensetracker.entities.Expense; import com.pedrocarrillo.expensetracker.entities.Reminder; import java.util.ArrayList; import java.util.UUID; import io.realm.Realm; import io.realm.RealmObject; import io.realm.RealmResults; /** * Created by Pedro on 9/20/2015. */ public class RealmManager { private Realm realm; private static RealmManager ourInstance = new RealmManager(); public static RealmManager getInstance() { return ourInstance; } public RealmManager(){ realm = Realm.getInstance(ExpenseTrackerApp.getContext()); } public Realm getRealmInstance() { return realm; } public <E extends RealmObject> void update(final E object) { realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { realm.copyToRealmOrUpdate(object); } }); } public <E extends RealmObject> void update(final Iterable<E> object) { realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { realm.copyToRealmOrUpdate(object); } }); } public <E extends RealmObject> void save(final E object, final Class<E> clazz) { realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { checkDuplicateUUID(object, clazz); realm.copyToRealmOrUpdate(object); } }); } public <E extends RealmObject> void delete(final Iterable<E> objects){ realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { if (objects == null) { return; } for (E object : objects) { if (object instanceof Category) { Category category = (Category) object; RealmResults<Expense> expenseList = Expense.getExpensesPerCategory(category); for (int i = expenseList.size()-1; i >= 0; i--) { expenseList.get(i).removeFromRealm(); } } object.removeFromRealm(); } } }); } public <E extends RealmObject> void delete(final E object){ realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { if (object instanceof Category) { Category category = (Category) object; RealmResults<Expense> expenseList = Expense.getExpensesPerCategory(category); for (int i = expenseList.size()-1; i >= 0; i--) { expenseList.get(i).removeFromRealm(); } } object.removeFromRealm(); } }); } public <E extends RealmObject> RealmObject findById(Class<E> clazz, String id) { return realm.where(clazz).equalTo("id", id).findFirst(); } public <E extends RealmObject> void checkDuplicateUUID(E object, Class<E> clazz) { boolean repeated = true; while (repeated) { String id = UUID.randomUUID().toString(); RealmObject realmObject = findById(clazz, id); if ( realmObject == null ) { if (object instanceof Expense) { ((Expense)object).setId(id); } else if (object instanceof Category){ ((Category)object).setId(id); } else { ((Reminder)object).setId(id); } repeated = false; } } } }