20,36 → 20,22 |
public class CurrenciesDatabase extends SQLiteOpenHelper |
{ |
private static final String DATABASE_NAME = "currency.db"; //$NON-NLS-1$ |
private static final int DATABASE_VERSION = 2; |
private static final int DATABASE_VERSION = 3; |
|
private static final String TABLE = "currency"; //$NON-NLS-1$ |
private static final String COLUMN_CURRENCY1 = "currency1"; //$NON-NLS-1$ |
private static final String COLUMN_CURRENCY2 = "currency2"; //$NON-NLS-1$ |
private static final String COLUMN_CURRENCY = "currency1"; //$NON-NLS-1$ |
private static final String COLUMN_FACTOR = "factor"; //$NON-NLS-1$ |
|
private static HashMap<String, HashMap<String, Double>> conversionRates = |
new HashMap<String, HashMap<String, Double>>(); |
private static HashMap<String, Double> conversionRates = |
new HashMap<String, Double>(); |
static |
{ |
HashMap<String, Double> conversionFactors = new HashMap<String, Double>(); |
conversionFactors.put(CurrenciesActivity.VALUE_EUR, 0.767842293); |
conversionFactors.put(CurrenciesActivity.VALUE_USD, 1.03413); |
CurrenciesDatabase.conversionRates.put(CurrenciesActivity.VALUE_CHF, |
conversionFactors); |
|
conversionFactors = new HashMap<String, Double>(); |
conversionFactors.put(CurrenciesActivity.VALUE_CHF, 1.30235077); |
conversionFactors.put(CurrenciesActivity.VALUE_USD, 1.3468); |
CurrenciesDatabase.conversionRates.put(CurrenciesActivity.VALUE_EUR, |
conversionFactors); |
|
conversionFactors = new HashMap<String, Double>(); |
conversionFactors.put(CurrenciesActivity.VALUE_CHF, 0.966996412); |
conversionFactors.put(CurrenciesActivity.VALUE_EUR, 0.742500743); |
CurrenciesDatabase.conversionRates.put(CurrenciesActivity.VALUE_USD, |
conversionFactors); |
/* Default conversion rates from Euro (EUR) to other currencies */ |
CurrenciesDatabase.conversionRates |
.put(CurrenciesActivity.VALUE_CHF, 1.3013); |
CurrenciesDatabase.conversionRates |
.put(CurrenciesActivity.VALUE_USD, 1.3521); |
} |
private final CurrenciesActivity context; |
|
/** |
* @param context |
59,7 → 45,6 |
{ |
super(context, CurrenciesDatabase.DATABASE_NAME, null, |
CurrenciesDatabase.DATABASE_VERSION); |
this.context = context; |
this.readConversionsFromDatabase(); |
} |
|
75,28 → 60,21 |
public void onCreate(SQLiteDatabase db) |
{ |
db.execSQL("CREATE TABLE IF NOT EXISTS " + CurrenciesDatabase.TABLE |
+ " (" + CurrenciesDatabase.COLUMN_CURRENCY1 + " TEXT, " |
+ CurrenciesDatabase.COLUMN_CURRENCY2 + " TEXT, " |
+ " (" + CurrenciesDatabase.COLUMN_CURRENCY + " TEXT, " |
+ CurrenciesDatabase.COLUMN_FACTOR |
+ " NUMERIC" |
+ ", CONSTRAINT unique_currency_pair UNIQUE (" |
+ CurrenciesDatabase.COLUMN_CURRENCY1 + ", " |
+ CurrenciesDatabase.COLUMN_CURRENCY2 + "))"); |
+ CurrenciesDatabase.COLUMN_CURRENCY + "))"); |
|
HashMap<String, HashMap<String, Double>> currencyConversions = |
HashMap<String, Double> currencyConversions = |
this.getConversionRates(); |
for (String key : currencyConversions.keySet()) |
for (Entry<String, Double> factorEntry : currencyConversions.entrySet()) |
{ |
for (Entry<String, Double> factorEntry : currencyConversions.get(key) |
.entrySet()) |
{ |
ContentValues values = new ContentValues(); |
values.put(CurrenciesDatabase.COLUMN_CURRENCY1, key); |
values.put(CurrenciesDatabase.COLUMN_CURRENCY2, factorEntry.getKey()); |
values.put(CurrenciesDatabase.COLUMN_FACTOR, factorEntry.getValue()); |
db.insert(CurrenciesDatabase.TABLE, CurrenciesDatabase.COLUMN_FACTOR, |
values); |
} |
ContentValues values = new ContentValues(); |
values.put(CurrenciesDatabase.COLUMN_CURRENCY, factorEntry.getKey()); |
values.put(CurrenciesDatabase.COLUMN_FACTOR, factorEntry.getValue()); |
db.insert(CurrenciesDatabase.TABLE, CurrenciesDatabase.COLUMN_FACTOR, |
values); |
} |
} |
|
119,7 → 97,7 |
/** |
* @return |
*/ |
public HashMap<String, HashMap<String, Double>> getConversionRates() |
public HashMap<String, Double> getConversionRates() |
{ |
return CurrenciesDatabase.conversionRates; |
} |
135,11 → 113,9 |
/* Get database connection, but upgrade database first if necessary! */ |
SQLiteDatabase dbConn = this.getWritableDatabase(); |
|
@SuppressWarnings("nls") |
Cursor cursor = |
dbConn.query(true, CurrenciesDatabase.TABLE, null, null, null, null, |
null, CurrenciesDatabase.COLUMN_CURRENCY1 + "," |
+ CurrenciesDatabase.COLUMN_CURRENCY2, null); |
null, CurrenciesDatabase.COLUMN_CURRENCY, null); |
|
if (cursor != null) |
{ |
147,10 → 123,7 |
{ |
int currency1Id = |
cursor |
.getColumnIndexOrThrow(CurrenciesDatabase.COLUMN_CURRENCY1); |
int currency2Id = |
cursor |
.getColumnIndexOrThrow(CurrenciesDatabase.COLUMN_CURRENCY2); |
.getColumnIndexOrThrow(CurrenciesDatabase.COLUMN_CURRENCY); |
int factorId = |
cursor.getColumnIndexOrThrow(CurrenciesDatabase.COLUMN_FACTOR); |
|
157,58 → 130,17 |
/* NOTE: Don't change the default values if the table is empty */ |
if (cursor.moveToFirst()) |
{ |
HashMap<String, HashMap<String, Double>> newCurrencyConversions = |
new HashMap<String, HashMap<String, Double>>(); |
HashMap<String, Double> mapForCurrency = null; |
String lastCurrency1Str = null; |
String currency1Str; |
HashMap<String, Double> newCurrencyConversions = |
new HashMap<String, Double>(); |
|
do |
{ |
currency1Str = cursor.getString(currency1Id); |
String currency2Str = cursor.getString(currency2Id); |
String currencyStr = cursor.getString(currency1Id); |
Double factor = cursor.getDouble(factorId); |
|
if (lastCurrency1Str == null |
|| !lastCurrency1Str.equals(currency1Str)) |
{ |
/* |
* NOTE: Update outer map when we see a new currency; |
* ORDER BY ensures we don't see a currency1 twice except |
* consecutively |
*/ |
if (mapForCurrency != null) |
{ |
newCurrencyConversions.put(lastCurrency1Str, mapForCurrency); |
} |
|
lastCurrency1Str = new String(currency1Str); |
|
/* NOTE: New currency1: Reset inner map */ |
mapForCurrency = newCurrencyConversions.get(currency1Str); |
} |
|
/* If we did not see this currency1 before */ |
if (mapForCurrency == null) |
{ |
mapForCurrency = new HashMap<String, Double>(); |
} |
|
/* |
* NOTE: Update inner map after each table row; assignment to |
* mapForCurrency above ensures we are putting the factor |
* into the correct map. |
*/ |
mapForCurrency.put(currency2Str, factor); |
newCurrencyConversions.put(currencyStr, factor); |
} |
while (cursor.moveToNext()); |
|
/* |
* NOTE: Update from last table row; cursor not empty, so we can |
* skip the test for null |
*/ |
newCurrencyConversions.put(currency1Str, mapForCurrency); |
|
CurrenciesDatabase.conversionRates = newCurrencyConversions; |
} |
} |
237,11 → 169,9 |
{ |
SQLiteDatabase dbConn = this.getReadableDatabase(); |
|
@SuppressWarnings("nls") |
Cursor myCursor = |
dbConn.query(true, CurrenciesDatabase.TABLE, null, null, null, null, |
null, CurrenciesDatabase.COLUMN_CURRENCY1 + "," |
+ CurrenciesDatabase.COLUMN_CURRENCY2, null); |
null, CurrenciesDatabase.COLUMN_CURRENCY, null); |
|
@SuppressWarnings({ "unused", "nls" }) |
String queryResult = ""; |
251,10 → 181,7 |
{ |
int currency1Id = |
myCursor |
.getColumnIndexOrThrow(CurrenciesDatabase.COLUMN_CURRENCY1); |
int currency2Id = |
myCursor |
.getColumnIndexOrThrow(CurrenciesDatabase.COLUMN_CURRENCY2); |
.getColumnIndexOrThrow(CurrenciesDatabase.COLUMN_CURRENCY); |
int factorId = |
myCursor.getColumnIndexOrThrow(CurrenciesDatabase.COLUMN_FACTOR); |
|
262,13 → 189,12 |
{ |
do |
{ |
String currency1Str = myCursor.getString(currency1Id); |
String currency2Str = myCursor.getString(currency2Id); |
String currencyStr = myCursor.getString(currency1Id); |
Double factor = myCursor.getDouble(factorId); |
|
/* DEBUG */ |
queryResult += |
currency1Str + " --> " + currency2Str + ": " + factor + "\n"; |
"EUR --> " + currencyStr + ": " + factor + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
} |
while (myCursor.moveToNext()); |
} |