Я полагаю, что причина в том, что SQLite (я сильно подозреваю, что Курсор, так что более корректно в аспекте Android SQLite SDK) кеширует данные (возможно, потому что базовые данные никогда не извлекаются из базы данных, так как нет необходимости получать данные (что касается курсора)).
Я пробовал различные проверки, включая установку точек останова, проверку результата getColumnnames и создание нестатического метода.
Как только я добавляю альтернативную проверку, используя PRAGMA table_info(*table_name*);
, столбец существует.
Поэтому я бы предложил использовать следующее: -
public static boolean isColumnExistsOld(String tableName, String columnName) {
Cursor csr = getDatabase().rawQuery("PRAGMA table_info(" + tableName + ")",null);
while(csr.moveToNext()) {
if (csr.getString(csr.getColumnIndex("name")).equalsIgnoreCase(columnName)) {
return true;
}
}
return false;
/*
Cursor cursor = null;
try {
SQLiteDatabase db = getDatabase();
cursor = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 1", null);
cursor.moveToFirst();
String[] cloNames = cursor.getColumnNames();
if (cloNames != null) {
for (String temp : cloNames) {
if (columnName.equalsIgnoreCase(temp)) {
return true;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != cursor && !cursor.isClosed()) {
cursor.close();
}
}
boolean rv = colfound;
return false;
*/
}
- Обратите внимание, что ваш код оставлен, но закомментирован.
Я полагаю, что оценка вынуждает обновлять кэш (т. Е. Я пробовал это, да, он динамически изменяется, чтобы включить столбец).