android SQLiteException: нет такого столбца на пользовательских roms - PullRequest
0 голосов
/ 02 февраля 2019

На устройствах с модифицированными версиями Android я получаю эту ошибку.Например на устройствах Xiaomi.

String query = "select * from dialogues where userId = ? and topChat = 0 order by updatedAtByClient desc";
Cursor dialogRes = db.rawQuery(query, new String[]{userId});

Здесь я получаю исключение:

android.database.sqlite.SQLiteException: no such column: topChat (code 1):,
while compiling: select * from dialogues where userId = ? and topChat = 0 
order by updatedAtByClient desc

Я написал сообщение об исключении вручную, потому что пользователь прислал его мне на скриншоте, поэтому могут быть опечатки.

Как это можно исправить и почему это происходит?

UPD1: оператор создания таблицы выглядит примерно так:

"CREATE TABLE IF NOT EXISTS dialogues(fieldName VARCHAR, camelCaseFieldName VARCHAR,
topChat INTEGER, createdAt DATE);";

И у меня правильно реализованометод обновления для меня, когда я изменяю структуру БД, но это конкретное имя таблицы и поля не менялось долгое время.

UPD2: я сделал apk для пользователя с проблемами, который регистрирует столбцы таблицы,и я видел проблемный столбец в журнале, и пользователь говорит, что эта версия работает нормально.

Так что, похоже, эта ошибка не происходит 100% раз.Очень странно.Может быть, есть способ проверить целостность базы данных после ее создания и воссоздать таблицы с ошибками?

1 Ответ

0 голосов
/ 02 февраля 2019

Я не верю, что это будет xiaomi проблема.скорее, это результат неудачной миграции, когда новый столбец не был добавлен, и впоследствии пользователь может по-прежнему работать с предыдущей версией таблицы.и нет другого логического объяснения отсутствующего столбца), просто потому, что либо оператор CREATE TABLE работает, либо нет.

можно обойти его с помощью ALTER TABLE.например.когда это SQLiteException происходит, addColumnIfNotExists("dialogues", "topChat", "INTEGER DEFAULT 0"); ... чтобы не вызывать потерю данных при удалении таблицы, только потому, что в ней отсутствует какой-либо столбец.

public void addColumnIfNotExists(String tableName, String columnName, String dataType) {
    Cursor cursor = null;
    try {
        cursor = db.rawQuery("SELECT * FROM " + tableName, null);
        if(! Arrays.asList(cursor.getColumnNames()).contains(columnName)) {
            db.execSQL(String.format("ALTER TABLE %s ADD COLUMN %s %s", tableName, columnName, dataType));
        }
    } finally {
        if(cursor != null) {
            cursor.close();
        }
    }
}
...