2013-07-07 4 views
0

Я разрабатываю приложение, которое управляет расходами и доходами пользователей, я достиг точки, в которой я довольно застрял и чувствую, что мне нужна помощь. Что я хочу сделать, это сохранить запись от общего баланса пользователя и выполнения расчетов на нем, в зависимости от действий пользователей. Если баланс hes равен 100 долларам, и он добавляет расход в 50 долларов, сэкономленный баланс будет обновлен до 50 долларов и т. д.База данных Android, работающая с валютой/балансом

Я не уверен, что это правильный способ сделать это или как написать функцию базы данных, чтобы выполнить математику в переменной «balance», это мой класс базы данных, я бы очень признателен за любой пример или отзыв ,

Прямо сейчас все, что я имею является основным «добавлять, обновлять, удалять, принеси» функции ...

public class TransactionsDatabase { 

private static final String DATABASE_NAME = "transactions_db"; 
private static final String DATABASE_TABLE = "transactions_table"; 
private static final int DATABASE_VERSION = 1; 

private static final String TRANSACTION_ID = "_id"; 
private static final String TRANSACTION_AMOUNT = "amount"; 
private static final String TRANSACTION_DESCRIPTION = "description"; 
private static final String TRANSACTION_DATE = "date"; 
private static final String TRANSACTION_CATEGORY = "category"; 
private static final String TRANSACTION_CURRENCY = "currency_type"; 
private static final String TRANSACTION_EXPENSE_OR_INCOME = "expenseOrIncome"; 
private static int BALANCE; // this is how I have tried to use the balance so far... 

private static final String CREATE_DATABASE = "create table transactions_table (_id integer primary key autoincrement, " 
+ "amount integer not null, date text not null, category text not null, currency_type text not null, description text not null, expenseOrIncome text not null);"; 

private static final String TAG = "TransactionsDatabase"; 
private DatabaseHelper DbHelper; 
private SQLiteDatabase SqlDatabase; 
private final Context ctx; 

private static class DatabaseHelper extends SQLiteOpenHelper { 

    public DatabaseHelper(Context context) { 

     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL(CREATE_DATABASE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
       + newVersion + ", which will erase old data"); 
     db.execSQL("DROP TABLE IF EXISTS expenses_table"); 
     onCreate(db); 
    }  
} 

TransactionsDatabase (Context c) { 
    this.ctx = c; 
} 

public TransactionsDatabase open() throws SQLException { 

    DbHelper = new DatabaseHelper(ctx); 
    SqlDatabase = DbHelper.getWritableDatabase(); 
    return this; 

} 

public void close() { 

    DbHelper.close(); 
} 

public long createExpenseOrIncome (int amount, String description, String date, String category, String currency_type, String expenseOrIncome) { 

    ContentValues values = new ContentValues(); 
    values.put(TRANSACTION_AMOUNT, amount); 
    values.put(TRANSACTION_DESCRIPTION, description); 
    values.put(TRANSACTION_DATE, date); 
    values.put(TRANSACTION_CATEGORY, category); 
    values.put(TRANSACTION_CURRENCY, currency_type); 
    values.put(TRANSACTION_EXPENSE_OR_INCOME, expenseOrIncome); 

    // Returns the row ID of newly inserted row, or -1 if an error occurred. 
    return SqlDatabase.insert(DATABASE_TABLE, null, values); 
} 

public boolean deleteExpenseOrIncome(long rowId) { 

    // Returns true if deleted, false otherwise. 
    return SqlDatabase.delete(DATABASE_TABLE, TRANSACTION_ID + "=" + rowId, null) > 0; 

} 

public Cursor fetchAllExpensesAndIncomes() { 

    // Returns a cursor over the list of all expenses/incomes. 

    return SqlDatabase.query(DATABASE_TABLE, new String[] { TRANSACTION_ID, 
      TRANSACTION_AMOUNT, TRANSACTION_DESCRIPTION, TRANSACTION_DATE, TRANSACTION_CATEGORY, TRANSACTION_CURRENCY, TRANSACTION_EXPENSE_OR_INCOME }, null, null, null, null, 
      null); 
} 

public Cursor fetchSpecificExpenseOrIncome(long rowId) throws SQLException { 

     Cursor mCursor = SqlDatabase.query(true, DATABASE_TABLE, new String[] { 
       TRANSACTION_AMOUNT, TRANSACTION_DESCRIPTION, 
       TRANSACTION_DATE, TRANSACTION_CATEGORY, TRANSACTION_CURRENCY, TRANSACTION_EXPENSE_OR_INCOME }, 
       TRANSACTION_ID + "=" + rowId, null, null, null, null, null); 

     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 
      return mCursor; 
    } 

public boolean updateExpenseOrIncome(long rowId, int amount, String description, String date, String category, String currency_type, String expenseOrIncome) { 

    // returns true if the expense/income was successfully updated, false otherwise. 

    ContentValues values = new ContentValues(); 
    values.put(TRANSACTION_AMOUNT, amount); 
    values.put(TRANSACTION_DESCRIPTION, description); 
    values.put(TRANSACTION_DATE, date); 
    values.put(TRANSACTION_CATEGORY, category); 
    values.put(TRANSACTION_CURRENCY, currency_type); 
    values.put(TRANSACTION_EXPENSE_OR_INCOME, expenseOrIncome); 

    return SqlDatabase.update(DATABASE_TABLE, values, TRANSACTION_ID + "=" + rowId, null) > 0; 

} 

public boolean deleteAllExpensesOrIncomes() { 

    // true if any number of rows were deleted, false otherwise. 

    return SqlDatabase.delete(DATABASE_TABLE, null, null) > 0; 
} 

public boolean deleteSpecificExpenseOrIncome(long rowId) { 

    // true if a row is deleted, false otherwise. 

    return SqlDatabase.delete(DATABASE_TABLE, TRANSACTION_ID + "=" + rowId, null) > 0; 
} 

}

ответ

0

Поскольку это только один пользователь Android приложение, я 'm собирается пропустить бит о кэшировании вычисленных значений (потому что поиск SQLite не очень трудоемкий). Если вы считаете, что вам нужен этот дополнительный бит производительности, вы должны обязательно подумать о том, чтобы вторая таблица кэшировала рассчитанные значения, которые обновляются при повторном запуске ваших вычислений.

Итак, на ваш реальный вопрос:

Давайте предположим, что вы хотите, чтобы написать основную функцию, чтобы получить общий баланс, основанный на ваши сделки и некоторое базовое значение. Это может выглядеть немного так:

public int getBalance(int baseValue) { 
    String[] cols = new String[] { 
     "SUM(" + TRANSACTION_AMOUNT + ")" 
    }; 
    try { 
     Cursor data = SqlDatabase.query(DATABASE_TABLE, cols, null, null, null, null, null); 
     return data.getInt(data.getColumnIndexOrThrow(cols[0])) + baseValue; 
    } catch(IllegalArgumentException e) { 
     Log.e("MyApp", "Couldn't get balance", e); 
     return 0; 
    } 
} 

SUM(..) SQL возвращает сумму значений столбца.

Конечно, этот код не будет работать сразу, потому что, с одной стороны, у вас есть отдельный столбец expenseOrIncome. Есть несколько способов справиться с этим. Во-первых: вы можете переписать вещи, чтобы использовать только один столбец, а отрицательные значения следует рассматривать как расходы и положительные значения, которые рассматриваются как доход.

В качестве альтернативы вы можете выполнить два запроса. Первый будет выбирать ваш доход, а второй - ваши расходы. Затем вы вычтите расходы из дохода, чтобы получить свой баланс.

+0

Спасибо за ответ, я рад, что кто-то может указать мне в правильном направлении. Теперь о расходовании средств. Я использую радиогруппу из двух вариантов, чтобы определить, какая из них - это расход или доход, я бы счастлив, если вы могли бы помочь мне реализовать, вы предлагаете использовать 1 колону для обоих. –

+0

Когда вы сохраняете данные из вашего входного фрагмента/действия, сделайте что-то вроде следующего: 'boolean isExpense =/* код, чтобы получить ли это расход или доход * /; int amount =/* код для получения суммы транзакции * /; if (isExpense) {amount * = -1; } 'Это переворачивает знак суммы транзакции таким образом, что если это расход, это будет противоположно тому, что было введено. Предполагая, что ваши пользователи вводят действительные данные, это всегда будет положительным для дохода и отрицательного для расходов. Затем вы просто сохраните это значение в столбце TRANSACTION_AMOUNT. –

+0

Отлично! таким образом, мне даже не нужна колонка расходовOrIncome! .. ой, но если я откажусь от этой колонки Как я буду отслеживать журнал истории? как все расходы и доходы, которые пользователь вставил раньше? Я имею в виду, что должен быть способ сохранить каждую транзакцию и следить за каждой транзакцией. –

Смежные вопросы