В моем приложении предполагается, что пользователи вводят сумму и нажимают кнопку «Добавить», чтобы добавить транзакции в таблицу «транзакции». Введенная пользователем сумма также обновит сумму указанной категории (определенный столбец)./ поле) в таблице «расходы».
Код кнопки добавления приведен ниже:
public void AddTransactions (final int temp_position) {
button_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int temp_id = 0;
Cursor transactionlatestid = myDb.getLatestTransactionID(temp_position);
if (transactionlatestid.getCount() == 0) {
temp_id = 1;
} else {
transactionlatestid.moveToFirst();
temp_id = transactionlatestid.getInt(0);
temp_id += 1;
}
String transaction_id = String.valueOf(temp_id);
String flightposition_id = String.valueOf(temp_position);
boolean isInserted = myDb.insertTransactionData(amount.getText().toString(), category, note.getText().toString(), transaction_id, flightposition_id);
if (isInserted = true) {
Toast.makeText(AddExpenses.this, "Transaction Inserted !", Toast.LENGTH_LONG).show();
clearText();
temp += 1;
getLatestAmount(temp_position, category);
}
else {
Toast.makeText(AddExpenses.this, "Transaction not Inserted !", Toast.LENGTH_LONG).show();
}
}
});
}
Метод getLatestAmount вызывается при успешном добавлении транзакции.Этот метод позволяет получить сумму указанной категории, которая в данный момент уже существует, в таблице «Расходы».Например, если категория «Еда и напитки», этот метод будет возвращать значение в этом столбце «foodndrinks» из таблицы «затрат», а затем вызывается «updateAddTotalExpenses».
Код ниже:
public void getLatestAmount (int temp_position, String category) {
temp_position += 1;
String id = String.valueOf(temp_position);
String temp_category = "";
double amountfromdb = 5.00 ;
if (category == "Food and Drinks")
{
temp_category = "foodndrinks";
}
else if (category == "Travel")
{
temp_category = "travel";
}
else if (category == "Shopping")
{
temp_category = "shopping";
}
else if (category == "Entertainment")
{
temp_category = "entertainment";
}
else if (category == "Others")
{
temp_category = "others";
}
Cursor latestamount = myDb.getLatestAmount(id, temp_category);
if (latestamount.getCount() == 0) {
Toast.makeText(AddExpenses.this, "No amount found !", Toast.LENGTH_LONG).show();
} else {
latestamount.moveToFirst();
amountfromdb = latestamount.getDouble(0);
updateAddTotalExpenses(id ,temp_category, amountfromdb);
}
}
Этот метод "updateAddTotalExpenses" используется для добавления суммы суммы в таблице "расходов" указанной категории и суммы, которая являетсявведенный пользователем, а затем обновите новейшую сумму в указанной категории в таблице «расходы».
public void updateAddTotalExpenses(String temp_position,String temp_category, double newestamount) {
double amount_tobeadded = Double.parseDouble(amount.getText().toString());
newestamount += amount_tobeadded;
if (category == "Food and Drinks") {
myDb.updateFnDData(temp_position, temp_category, newestamount);
}
sTracker.RefreshAllSpendings();
}
Код таблицы «расходы» в моем DatabaseHelper.class, который расширяет SQLiteOpenHelper: -
private static final String SPENDING_TABLE = "spendings";
private static final String ID_SPENDING = "id";
private static final String BUDGET = "budget";
private static final String TOTAL_EXPENSES = "total_expenses";
private static final String FOODNDRINKS = "foodndrinks";
private static final String TRAVEL = "travel";
private static final String SHOPPING = "shopping";
private static final String ENTERTAINMENT = "entertainment";
private static final String OTHERS = "others";
private static final String BALANCE = "balance";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + SPENDING_TABLE + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, BUDGET DOUBLE, TOTAL_EXPENSES DOUBLE, FOODNDRINKS DOUBLE, TRAVEL DOUBLE, SHOPPING DOUBLE, ENTERTAINMENT DOUBLE, OTHERS DOUBLE, BALANCE DOUBLE)");
db.execSQL("CREATE TABLE " + TRANSACTION_TABLE + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, AMOUNT DOUBLE NOT NULL, CATEGORY TEXT NOT NULL, NOTE TEXT, TRANSACTION_ID TEXT NOT NULL, FLIGHT_ID INTEGER NOT NULL, FOREIGN KEY (FLIGHT_ID) REFERENCES FLIGHT_TABLE(id) )");
}
Приведенный ниже метод находится в классе DatabaseHelper.class, который вызывается из класса Main для получения суммы указанной категории в таблице «расходов».
public Cursor getLatestAmount(String id, String category) {
SQLiteDatabase db = this.getWritableDatabase();
Cursor latestamount = db.rawQuery("SELECT "+category+" FROM spendings WHERE id =" +id , null);
return latestamount;
}
Методниже "updateFnDData" находится в DatabaseHelper.class, который вызывается из класса Main для обновления суммы указанной категории с помощью newestamount (старая сумма + новая сумма, введенная пользователем)
*** Примечание: длятеперь у меня есть только один метод для обновления столбца в таблице «расходы», который является столбцом «foodndrinks», так как я просто хочу проверить, является ли моя концепцияt и код верен, прежде чем я добавлю еще.
public boolean updateFnDData(String id, String category, double newamount) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
db.update(SPENDING_TABLE, contentValues, "id = ?"+"category = ?", new String[] {id});
return true;
}
Ниже приведен logcat, который появляется, когда я пытаюсь нажать кнопку «добавить» после ввода суммы в поле EditText
, транзакция успешно завершенадобавляется в таблицу «транзакции», но сумма в таблице «расходы» указанной категории не обновляется. особенно это два метода "getLatestAmount"
и "updateFnDData"
в DatabaseHelper.class
.
--------- beginning of crash
10-23 22:07:23.419 4070-4070/project.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: project.myapplication, PID: 4070
java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:539)
at project.myapplication.AddExpenses.updateAddTotalExpenses(AddExpenses.java:231)
at project.myapplication.AddExpenses.getLatestAmount(AddExpenses.java:225)
at project.myapplication.AddExpenses$3.onClick(AddExpenses.java:155)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)