/* * MoneyBalance - Android-based calculator for tracking and balancing expenses * Copyright (C) 2012 Ingo van Lil <inguin@gmx.de> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ivl.android.moneybalance.dao; import ivl.android.moneybalance.data.Currency; import ivl.android.moneybalance.data.Calculation; import ivl.android.moneybalance.data.Expense; import ivl.android.moneybalance.data.Person; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.database.Cursor; public class CalculationDataSource extends AbstractDataSource<Calculation> { private final DataBaseHelper dbHelper; private static final String[] COLUMNS = { DataBaseHelper.COLUMN_ID, DataBaseHelper.COLUMN_TITLE, DataBaseHelper.COLUMN_CURRENCY }; public CalculationDataSource(DataBaseHelper dbHelper) { super(dbHelper, DataBaseHelper.TABLE_CALCULATIONS, COLUMNS); this.dbHelper = dbHelper; } @Override protected ContentValues toContentValues(Calculation calculation) { ContentValues values = new ContentValues(); values.put(DataBaseHelper.COLUMN_TITLE, calculation.getTitle()); values.put(DataBaseHelper.COLUMN_CURRENCY, calculation.getMainCurrencyCode()); return values; } @Override public Calculation fromCursor(Cursor cursor) { long calculationId = cursor.getLong(0); String title = cursor.getString(1); String mainCurrencyCode = cursor.getString(2); Calculation calculation = new Calculation(title, mainCurrencyCode); calculation.setId(calculationId); CurrencyDataSource currencyDataSource = new CurrencyDataSource(dbHelper); Cursor currenciesCursor = currencyDataSource.listByCalculation(calculationId); List<Currency> currencies = currencyDataSource.getAllFromCursor(currenciesCursor); calculation.setCurrencies(currencies); PersonDataSource personDataSource = new PersonDataSource(dbHelper, calculation); Cursor personsCursor = personDataSource.listByCalculation(); List<Person> persons = personDataSource.getAllFromCursor(personsCursor); calculation.setPersons(persons); ExpenseDataSource expenseDataSource = new ExpenseDataSource(dbHelper, calculation); List<Expense> expenses = new ArrayList<>(); calculation.setExpenses(expenses); for (Person person : persons) { Cursor expensesCursor = expenseDataSource.listByPerson(person.getId()); List<Expense> personExpenses = expenseDataSource.getAllFromCursor(expensesCursor); expenses.addAll(personExpenses); } return calculation; } @Override public void delete(long id) { Calculation calculation = get(id); ExpenseDataSource expenseDataSource = new ExpenseDataSource(dbHelper, calculation); for (Expense expense : calculation.getExpenses()) expenseDataSource.delete(expense.getId()); PersonDataSource personDataSource = new PersonDataSource(dbHelper, calculation); for (Person person : calculation.getPersons()) personDataSource.delete(person.getId()); CurrencyDataSource currencyDataSource = new CurrencyDataSource(dbHelper); for (Currency currency : calculation.getCurrencies()) currencyDataSource.delete(currency.getId()); super.delete(id); } @Override public void update(Calculation calculation) { super.update(calculation); CurrencyDataSource currencyDataSource = new CurrencyDataSource(dbHelper); Cursor currenciesCursor = currencyDataSource.listByCalculation(calculation.getId()); List<Currency> oldCurrencies = currencyDataSource.getAllFromCursor(currenciesCursor); for (Currency oldCurrency : oldCurrencies) { Currency newCurrency = null; for (Currency c : calculation.getCurrencies()) if (oldCurrency.getCurrencyCode().equals(c.getCurrencyCode())) newCurrency = c; if (newCurrency != null) currencyDataSource.update(newCurrency); else currencyDataSource.delete(oldCurrency.getId()); } for (Currency newCurrency : calculation.getCurrencies()) { boolean found = false; for (Currency oldCurrency : oldCurrencies) if (oldCurrency.getCurrencyCode().equals(newCurrency.getCurrencyCode())) found = true; if (!found) currencyDataSource.insert(newCurrency); } } public Calculation createCalculation(String title, String mainCurrencyCode, List<String> personNames) { Calculation calculation = new Calculation(title, mainCurrencyCode); insert(calculation); CurrencyDataSource currencyDataSource = new CurrencyDataSource(dbHelper); Currency mainCurrency = new Currency(calculation.getId()); mainCurrency.setCurrencyCode(mainCurrencyCode); currencyDataSource.insert(mainCurrency); PersonDataSource personDataSource = new PersonDataSource(dbHelper, calculation); for (String personName : personNames) { Person person = new Person(calculation); person.setName(personName); personDataSource.insert(person); } return get(calculation.getId()); } }