package org.gnucash.android.db.adapter; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import android.support.annotation.NonNull; import android.util.Log; import com.crashlytics.android.Crashlytics; import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.DatabaseSchema; import org.gnucash.android.model.Commodity; import static org.gnucash.android.db.DatabaseSchema.CommodityEntry; /** * Database adapter for {@link org.gnucash.android.model.Commodity} */ public class CommoditiesDbAdapter extends DatabaseAdapter<Commodity> { /** * Opens the database adapter with an existing database * * @param db SQLiteDatabase object */ public CommoditiesDbAdapter(SQLiteDatabase db) { super(db, CommodityEntry.TABLE_NAME, new String[]{ CommodityEntry.COLUMN_FULLNAME, CommodityEntry.COLUMN_NAMESPACE, CommodityEntry.COLUMN_MNEMONIC, CommodityEntry.COLUMN_LOCAL_SYMBOL, CommodityEntry.COLUMN_CUSIP, CommodityEntry.COLUMN_SMALLEST_FRACTION, CommodityEntry.COLUMN_QUOTE_FLAG }); /** * initialize commonly used commodities */ Commodity.USD = getCommodity("USD"); Commodity.EUR = getCommodity("EUR"); Commodity.GBP = getCommodity("GBP"); Commodity.CHF = getCommodity("CHF"); Commodity.CAD = getCommodity("CAD"); Commodity.JPY = getCommodity("JPY"); Commodity.AUD = getCommodity("AUD"); Commodity.DEFAULT_COMMODITY = getCommodity(GnuCashApplication.getDefaultCurrencyCode()); } public static CommoditiesDbAdapter getInstance(){ return GnuCashApplication.getCommoditiesDbAdapter(); } @Override protected @NonNull SQLiteStatement setBindings(@NonNull SQLiteStatement stmt, @NonNull final Commodity commodity) { stmt.clearBindings(); stmt.bindString(1, commodity.getFullname()); stmt.bindString(2, commodity.getNamespace().name()); stmt.bindString(3, commodity.getMnemonic()); stmt.bindString(4, commodity.getLocalSymbol()); stmt.bindString(5, commodity.getCusip()); stmt.bindLong(6, commodity.getSmallestFraction()); stmt.bindLong(7, commodity.getQuoteFlag()); stmt.bindString(8, commodity.getUID()); return stmt; } @Override public Commodity buildModelInstance(@NonNull final Cursor cursor) { String fullname = cursor.getString(cursor.getColumnIndexOrThrow(CommodityEntry.COLUMN_FULLNAME)); String mnemonic = cursor.getString(cursor.getColumnIndexOrThrow(CommodityEntry.COLUMN_MNEMONIC)); String namespace = cursor.getString(cursor.getColumnIndexOrThrow(CommodityEntry.COLUMN_NAMESPACE)); String cusip = cursor.getString(cursor.getColumnIndexOrThrow(CommodityEntry.COLUMN_CUSIP)); String localSymbol = cursor.getString(cursor.getColumnIndexOrThrow(CommodityEntry.COLUMN_LOCAL_SYMBOL)); int fraction = cursor.getInt(cursor.getColumnIndexOrThrow(CommodityEntry.COLUMN_SMALLEST_FRACTION)); int quoteFlag = cursor.getInt(cursor.getColumnIndexOrThrow(CommodityEntry.COLUMN_QUOTE_FLAG)); Commodity commodity = new Commodity(fullname, mnemonic, fraction); commodity.setNamespace(Commodity.Namespace.valueOf(namespace)); commodity.setCusip(cusip); commodity.setQuoteFlag(quoteFlag); commodity.setLocalSymbol(localSymbol); populateBaseModelAttributes(cursor, commodity); return commodity; } @Override public Cursor fetchAllRecords() { return mDb.query(mTableName, null, null, null, null, null, CommodityEntry.COLUMN_FULLNAME + " ASC"); } /** * Fetches all commodities in the database sorted in the specified order * @param orderBy SQL statement for orderBy without the ORDER_BY itself * @return Cursor holding all commodity records */ public Cursor fetchAllRecords(String orderBy) { return mDb.query(mTableName, null, null, null, null, null, orderBy); } /** * Returns the commodity associated with the ISO4217 currency code * @param currencyCode 3-letter currency code * @return Commodity associated with code or null if none is found */ public Commodity getCommodity(String currencyCode){ Cursor cursor = fetchAllRecords(CommodityEntry.COLUMN_MNEMONIC + "=?", new String[]{currencyCode}, null); Commodity commodity = null; if (cursor.moveToNext()){ commodity = buildModelInstance(cursor); } else { String msg = "Commodity not found in the database: " + currencyCode; Log.e(LOG_TAG, msg); Crashlytics.log(msg); } cursor.close(); return commodity; } public String getCurrencyCode(@NonNull String guid) { Cursor cursor = mDb.query(mTableName, new String[]{CommodityEntry.COLUMN_MNEMONIC}, DatabaseSchema.CommonColumns.COLUMN_UID + " = ?", new String[]{guid}, null, null, null); try { if (cursor.moveToNext()) { return cursor.getString(cursor.getColumnIndexOrThrow(CommodityEntry.COLUMN_MNEMONIC)); } else { throw new IllegalArgumentException("guid " + guid + " not exits in commodity db"); } } finally { cursor.close(); } } }