/* * Copyright (C) 2012-2016 The Android Money Manager Ex Project Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.money.manager.ex.datalayer; import android.content.Context; import android.database.Cursor; import com.money.manager.ex.Constants; import com.money.manager.ex.database.DatasetType; import com.money.manager.ex.database.WhereStatementGenerator; import com.money.manager.ex.domainmodel.Stock; import com.money.manager.ex.utils.MmxDatabaseUtils; import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import info.javaperformance.money.Money; /** * Data repository for Stock entities. */ public class StockRepository extends RepositoryBase<Stock> { @Inject public StockRepository(Context context) { super(context, "stock_v1", DatasetType.TABLE, "stock"); } // @Override public String[] getAllColumns() { String [] idColumn = new String[] { "STOCKID AS _id" }; return ArrayUtils.addAll(idColumn, tableColumns()); } public boolean delete(int id) { int result = super.delete(StockFields.STOCKID + "=?", new String[] { Integer.toString(id)}); return result > 0; } public String[] tableColumns() { Field[] fields = StockFields.class.getFields(); String[] names = new String[fields.length]; for(int i = 0; i < fields.length; i++) { names[i] = fields[i].getName(); } return names; } public Stock load(int id) { if (id == Constants.NOT_SET) return null; return first(Stock.class, null, StockFields.STOCKID + "=?", new String[] { Integer.toString(id) }, null); } /** * Load multiple items by id. * @param ids Array of ids to load. * @return List of stocks. */ public List<Stock> load(Integer[] ids) { if (ids.length == 0) return null; MmxDatabaseUtils dbUtils = new MmxDatabaseUtils(getContext()); String placeHolders = dbUtils.makePlaceholders(ids.length); String[] idParams = new String[ids.length]; for (int i = 0; i < ids.length; i++) { idParams[i] = Integer.toString(ids[i]); } Cursor c = openCursor(null, StockFields.STOCKID + " IN (" + placeHolders + ")", idParams, null); if (c == null) return null; List<Stock> result = getEntities(c); return result; } public List<Stock> loadForSymbols(String[] symbols) { if (symbols.length == 0) return null; MmxDatabaseUtils dbUtils = new MmxDatabaseUtils(getContext()); String placeHolders = dbUtils.makePlaceholders(symbols.length); Cursor c = openCursor(null, StockFields.SYMBOL + " IN (" + placeHolders + ")", symbols, null); if (c == null) return null; List<Stock> result = getEntities(c); return result; } /** * Retrieves all record ids which refer the given symbol. * @return array of ids of records which contain the symbol. */ public int[] findIdsBySymbol(String symbol) { int[] result; Cursor cursor = getContext().getContentResolver().query(this.getUri(), new String[]{ StockFields.STOCKID }, StockFields.SYMBOL + "=?", new String[]{symbol}, null); if (cursor == null) return null; int records = cursor.getCount(); result = new int[records]; for (int i = 0; i < records; i++) { cursor.moveToNext(); result[i] = cursor.getInt(cursor.getColumnIndex(StockFields.STOCKID)); } cursor.close(); return result; } public boolean insert(Stock stock) { return insert(stock.contentValues) > 0; } public boolean save(Stock stock) { int id = stock.getId(); WhereStatementGenerator generator = new WhereStatementGenerator(); String where = generator.getStatement(StockFields.STOCKID, "=", id); return update(stock, where); } /** * Update price for all the records with this symbol. * @param symbol Stock symbol * @param price Stock price */ public void updateCurrentPrice(String symbol, Money price) { int[] ids = findIdsBySymbol(symbol); // recalculate value for (int id : ids) { Stock stock = load(id); stock.setCurrentPrice(price); // recalculate & assign the value Money value = stock.getValue(); save(stock); } } private List<Stock> getEntities(Cursor c) { List<Stock> result = new ArrayList<>(); while (c.moveToNext()) { result.add(Stock.from(c)); } c.close(); return result; } }