База данных не обновляет данные из одного действия в другое - PullRequest
1 голос
/ 30 мая 2019

Мне нужно передать данные из DeleteLayout, чтобы обновить данные в historyActivity, которые будут обновляться после того, как я отредактирую данные. Он не выдает никакой ошибки, но мои данные не обновляются после редактирования.Что можно сделать для передачи данных между действиями и обновления базы данных.

Мой метод updateDatamethod в DatabaseHelper выглядит следующим образом:

    public boolean updateData(String goalDate, String goalWeight, String currentWeight){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        String where = "GDATE = ? AND GWEIGHT = ?  AND CWEIGHT = ?";
        contentValues.put(Col2, goalDate);
        contentValues.put(Col3, goalWeight);
        contentValues.put(Col4, currentWeight);
        db.update(TABLE_NAME, contentValues, where, new String[]{goalDate,goalWeight,currentWeight});
        return true;
    }

Deletelayout

   protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.deletelayout);
        GoalDate = findViewById(R.id.goalDate2);
        CurrentWeight = findViewById(R.id.weighGoal2);
        GoalWeight = findViewById(R.id.weightCurrent2);
        goalD = findViewById(R.id.goalDateInput);
        goalW = findViewById(R.id.goalWeightInput);
        currentW = findViewById(R.id.currentWeightInput);

        imageView = findViewById(R.id.imageShow);
        data = myDB.getListContents();
        deleteB = findViewById(R.id.deleteB);
        updateB = findViewById(R.id.updateButton);
        // Entered information from the user are set to the respective variables.
        int numRows = data.getCount();
        j = new Intent(DeleteLayout.this, historyActivity.class);

        if (numRows == 0) {
            Toast.makeText(DeleteLayout.this, "Nothing in the db", Toast.LENGTH_LONG).show();
        } else {
            int i = 0;
            while (data.moveToNext()) {
                user = new User(data.getString(1), data.getString(2), data.getString(3), data.getString(4), data.getString(5));
                gWt = user.getGoalWeight();
                cWt = user.getCurrentWeight();
                gDt = user.getGoalDate();
                GoalDate.setText(gDt);
                GoalWeight.setText(gWt);
                CurrentWeight.setText(cWt);

                deleteB.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        myDB.deleteContent(GoalDate.getText().toString(), GoalWeight.getText().toString(), CurrentWeight.getText().toString());
                        startActivity(j);
                    }
                });
                updateB.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        boolean myUpdate = myDB.updateData(goalD.getText().toString(), goalW.getText().toString(), currentW.getText().toString());
                        if(myUpdate == true){
                            Toast.makeText(DeleteLayout.this, "Data updated", Toast.LENGTH_SHORT).show();
                        }
                        else{
                            Toast.makeText(DeleteLayout.this, "Data not updated", Toast.LENGTH_SHORT).show();

                        }
                        startActivity(j);
                    }
                });
            }

        }

    }

1 Ответ

2 голосов
/ 30 мая 2019

Вопросы

Одна из проблем, с которой вы столкнулись, заключается в том, что вы не запрашиваете никаких изменений.

Кроме того, вы всегда предполагаете, что строка или строки всегда были обновлены, т.е. вы не проверяете, были ли выполнены какие-либо обновления.

  • Метод SQliteDatabase update возвращает целое число с количеством обновленных строк. Если ни один из них не обновлен, он вернет 0.

Объяснение

Учтите, что goalDate равно 2019-01-01 и goalWeight равно 100 и currentWeight равно 200 , тогда вы говорите

  • обновление
    • goalDate до 2019-01-01 и
    • goalWeight до 100 и
    • текущий вес до 200
  • для строки (й) , где
    • goalDate is 2019-01-01 и
    • goalWeight is 100 и
    • currentWeight is 200

Fix

Вместо: -

public boolean updateData(String goalDate, String goalWeight, String currentWeight){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    String where = "GDATE = ? AND GWEIGHT = ?  AND CWEIGHT = ?";
    contentValues.put(Col2, goalDate);
    contentValues.put(Col3, goalWeight);
    contentValues.put(Col4, currentWeight);
    db.update(TABLE_NAME, contentValues, where, new String[]{goalDate,goalWeight,currentWeight});
    return true;
}

То, что вы хотите, это что-то вроде: -

public boolean updateData(String goalDate, String goalWeight, String currentWeight, String newGoaldate, String newGoalWeight, String newCurrentWeight){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    String where = "GDATE = ? AND GWEIGHT = ?  AND CWEIGHT = ?";
    contentValues.put(Col2, newGoalDate);
    contentValues.put(Col3, newGoalWeight);
    contentValues.put(Col4, newCurrentWeight);
    if (db.update(TABLE_NAME, contentValues, where, new String[]{goalDate,goalWeight,currentWeight}) > 0) {
        return true;
    }
    return false;
}
  • Первые 3 параметра - это исходные значения (используются для поиска строки, подлежащей обновлению), второй набор - значения, которые будут использоваться для обновления найденной строки или строк).

Extra

В идеале вы также должны изменить: -

 String where = "GDATE = ? AND GWEIGHT = ?  AND CWEIGHT = ?";

до: -

String where = Col2 + "=? AND " + Col3 + "=?  AND " + Col4 +"=?";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...