Как исправить «нераспознанный токен» при выполнении вызова db.delete - PullRequest
0 голосов
/ 16 октября 2019

Я использую SQLite для хранения и извлечения данных для приложения Android. Я создал метод, который удаляет записи в таблице, удаляя их первичный ключ, который является UUID. Однако, когда я вызываю свою команду .delete, я получаю нераспознанный токен.

(Текущее мышление) База данных ожидает точного определения строки, где в качестве удаляемой записи указывается использование c.getId (), которое возвращаетUUID, а не строка. Но я не уверен, как преобразовать его или, возможно, это синтаксическая проблема в выражении.

// CheckInList.java

public class CheckInList {
    private static CheckInList sCheckInList;
    private Context mContext;
    public SQLiteDatabase mDataBase;
...
//PROBLEM METHOD v
public void deleteCheckIn(CheckIn c) {
        mDataBase.delete(DATABASE_NAME,  CheckInTable.Cols.UUID + "=" + c.getId(), null);
    }
...

/// CheckInBaseHelper

public class CheckInBaseHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;
    public static final String DATABASE_NAME = "checkinBase.db";

    public CheckInBaseHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create TABLE " + CheckInTable.NAME + "(" +
                " _id integer primary key autoincrement, " +
                CheckInTable.Cols.UUID + ", " +
                CheckInTable.Cols.TITLE + ", " +
                CheckInTable.Cols.PLACE + ", " +
                CheckInTable.Cols.DETAILS + ", " +
                CheckInTable.Cols.DATE + ", " +
                CheckInTable.Cols.LATITUDE + ", " +
                CheckInTable.Cols.LONGITUDE +
                ")"
        );
    }

/// CheckInCursorWrapper

public class CheckInCursorWrapper extends CursorWrapper {
    public CheckInCursorWrapper(Cursor cursor) {
        super(cursor);
    }

    public CheckIn getCheckIn() {
        String uuidString = getString(getColumnIndex(CheckInTable.Cols.UUID));
        String title = getString(getColumnIndex(CheckInTable.Cols.TITLE));
        String place = getString(getColumnIndex(CheckInTable.Cols.PLACE));
        String details = getString(getColumnIndex(CheckInTable.Cols.DETAILS));
        long date = getInt(getColumnIndex(CheckInTable.Cols.DATE));
        Double latitude = getDouble(getColumnIndex(CheckInTable.Cols.LATITUDE));
        Double longitude = getDouble(getColumnIndex(CheckInTable.Cols.LONGITUDE));

        CheckIn checkin = new CheckIn(UUID.fromString(uuidString));
        checkin.setTitle(title);
        checkin.setPlace(place);
        checkin.setDetails(details);
        checkin.setDate(new Date(date));
        checkin.setLatitude(latitude);
        checkin.setLongitude(longitude);

        return checkin;
    }
}

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

SQLiteExceptions: unrecognized token: "7ac5"

android.database.sqlite.SQLiteException: unrecognized token: "7ac5" (code 1 SQLITE_ERROR): , while compiling: DELETE FROM checkinBase.db WHERE uuid=d21a141d-7ac5-487b-a5af-6eae0825ac37

1 Ответ

0 голосов
/ 16 октября 2019

В дополнение к проблеме с нераспознанным токеном у вас есть еще одна проблема, с которой вы можете столкнуться. Проблемы: -

  • a) Вы удаляете из ТАБЛИЦЫ не базу данных , которая может (БУДЕТ) иметь несколько таблиц.

  • b) вам нужно заключить строку в одинарные кавычки, то есть использовать uuid = 'd21a141d-7ac5-487b-a5af-6eae0825ac37'. Вы можете изменить ...... + "=" + c.getId() на ...... + "='" + c.getId() + "'".

Однако рекомендуется связывать значения (обычно вы используете заполнитель ?, который заменяется значением, которое соответствующим образом заключено (например, добавлены одинарные кавычки)), что защищает от внедрения SQL.

Полное исправление будет состоять в том, чтобы изменить: -

public void deleteCheckIn(CheckIn c) {
    mDataBase.delete(DATABASE_NAME,  CheckInTable.Cols.UUID + "=" + c.getId(), null);
}

на

public int deleteCheckIn(CheckIn c) {
    return mDataBase.delete(CheckInTable.NAME,  CheckInTable.Cols.UUID + "=?", new String[]{c.getId()});
}

Вышебудет: -

  • Использовать таблицу вместо базы данных, исключив исключение из таблицы, которое должно было произойти.
  • исправит нераспознанный токен.
  • protectпротив внедрения SQL.
  • возвращает количество удаленных строк, что может быть полезно знать (например, если 0 строк не было удалено).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...