Добавление оператора AND в SQL lite Функция удаления - Crashing App - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь стереть запись о вводе ОБА имени и фамилии по понятным причинам.Моя попытка заключается в следующем (прослушиватель «Моё удаление при щелчке»):

delete.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    if (fname.getText().toString().trim().length() == 0 ||
        lname.getText().toString().trim().length() == 0) {
        showMessage("Error", "Please enter First and Last Name");
        return;
    }

    Cursor c = db.rawQuery("SELECT * FROM customer WHERE fname='" + fname.getText() + "' AND lname='" + lname.getText() + "''", null);
    if (c.moveToFirst()) {
        db.execSQL("DELETE FROM customer WHERE fname='" + fname.getText() + "' AND lname='" + lname.getText() + "''");
        showMessage("Success", "Record Deleted");
    }
    else {
        showMessage("Error", "Invalid First and Last Name");
    }
    clearText();
}
});

Я получаю ошибку в строке 72, которая является курсором.

Что я не правильно делаю?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

В отношении комментария: -

не слишком уверен в подготовленных утверждениях, но не прочь узнать о них в этом контексте, если вы хотите дать код для одного

Вот прямая адаптация вашего кода, которая переключается с использования методов rawQuery и execSQL на удобные методы query и delete, которые готовят операторы.

Код такжеустраняет проблему, которая, возможно, смущает вас или даже является реальной проблемой, когда вам нужно использовать метод toString (как вы это делали ранее) для получения данных в EditTexts.

    String whereclause = "fname =? AND lname + =?"; //<<<< Where statement with ?'s for arguments
    String[] whereargs = new String[]{
            fname.getText().toString(), // First arg for first ?
            lname.getText().toString()  // Second arg for second ?
    };

    Cursor c = db.query(
            "customer", //<<<< table name
            null, //<<<< equates to * (all columns)
            whereclause, //<<<< the WHERE clause (less WHERE keyword)
            whereargs, //<<<< the argumnets to replace the ?'s (will be escaped/enclosed in quotes for you)
            null,
            null,
            null
    );

    //<<<<< REPLACED Cursor c = db.rawQuery("SELECT * FROM customer WHERE fname='" + fname.getText() + "' AND lname='" + lname.getText() + "''", null);
    if (c.moveToFirst()) {
        db.delete(
                "customer",
                whereclause,
                whereargs
        );
        //<<<<< REPLACED db.execSQL("DELETE FROM customer WHERE fname='" + fname.getText() + "' AND lname='" + lname.getText() + "''");
        showMessage("Success", "Record Deleted");
    } else {
        showMessage("Error", "Invalid First and Last Name");
    }

Примечания:-

  • Для получения содержимого EditText следует использовать метод toString.

Дополнительно

Однако для удобства delete методвозвращает количество строк, которые были удалены, так как int, запрос для проверки на существование является излишним, поэтому вышеприведенное можно упростить до: -

    String whereclause = "fname =? AND lname + =?"; //<<<< Where statement with ?'s for arguments
    String[] whereargs = new String[]{
            fname.getText().toString(), // First arg for first ?
            lname.getText().toString()  // Second arg for second ?
    };
    if (db.delete(
                "customer",
                whereclause,
                whereargs) > 0) {
        showMessage("Success", "Record Deleted");
    } else {
        showMessage("Error", "Invalid First and Last Name");
    } 

Вы можете рассмотреть возможность просмотраследующее длядополнительная информация: -

0 голосов
/ 25 мая 2018

Вам следует серьезно подумать об использовании здесь подготовленного оператора, так как это решило бы проблему правильного экранирования всех литералов в вашем операторе DELETE.Поскольку я не знаю, какой фреймворк вы используете, я не буду давать код для одного.Для немедленного решения вашей проблемы удалите лишнюю одинарную кавычку после фамилии:

String sql = "SELECT * FROM customer WHERE fname = '" + wfname.getText();
sql += "' AND lname = '" + lname.getText() + "'";
Cursor c = db.rawQuery(sql, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...