SQLite обновляет определенные столбцы таблицы нажатием кнопки «добавить», ошибка и вылетает - PullRequest
0 голосов
/ 23 октября 2018

В моем приложении предполагается, что пользователи вводят сумму и нажимают кнопку «Добавить», чтобы добавить транзакции в таблицу «транзакции». Введенная пользователем сумма также обновит сумму указанной категории (определенный столбец)./ поле) в таблице «расходы».

Код кнопки добавления приведен ниже:

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)

1 Ответ

0 голосов
/ 23 октября 2018

В этих строках updateFnDData():

ContentValues contentValues = new ContentValues();
db.update(SPENDING_TABLE, contentValues, "id = ?"+"category = ?", new String[] {id});

вы передаете пустой contentValues методу update().Перед db.update() установите contentValues следующим образом:contentValues.put(columnname, newamount);замените columnname на имя столбца, который будет обновлен. Отредактируйте в SPENDING_TABLE, где вы хотите обновить, нет столбца category.Возможно, вам следует изменить WHERE часть метода update() на что-то вроде:"id = ? AND something = ?" Edit2 изменить на это в updateFnDData():

ContentValues contentValues = new ContentValues();
contentValues.put("foodndrinks", newamount);
db.update(SPENDING_TABLE, contentValues, "id = ?", new String[] {id});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...