Столбец, несомненно, существует в вашей базе данных, но если вы не добавили столбец к объекту, называемому карта проекции , вы получите сообщение об ошибке «неверный столбец».Вы можете добавить карту проекции через объект построителя запросов, например:
// The projection map is a hashmap of strings
HashMap<String, String> MyProjectionMap;
MyProjectionMap = new HashMap<String, String>();
// Add column mappings to the projection map
MyProjectionMap.put(Tasks._ID, Tasks._ID);
MyProjectionMap.put(Tasks.TITLE, Tasks.TITLE);
[...]
SQLiteQueryBuilder qb;
qb.setTables("tasks");
qb.setProjectionMap(MyProjectionMap)
// Then do your query
Cursor c = qb.query(db, projection, ...)
Чтобы понять, что происходит, найдите в источнике класс SQLiteQueryBuilder, и вы увидите следующее:
private String[] computeProjection(String[] projectionIn) {
if (projectionIn != null && projectionIn.length > 0) {
if (mProjectionMap != null) {
[...]
for (int i = 0; i < length; i++) {
String userColumn = projectionIn[i];
String column = mProjectionMap.get(userColumn);
[...]
if (!mStrictProjectionMap && ( userColumn.contains(" AS ") || userColumn.contains(" as "))) {
/* A column alias already exist */
projection[i] = userColumn;
continue;
}
throw new IllegalArgumentException("Invalid column " + projectionIn[i]);
}
}
[...]
По сути, он проверяет столбцы, которые вы запрашивали в своей проекции, по списку «разрешенных» столбцов, и вы можете видеть, что если карта не содержит столбец из вашей проекции, она выдаст исключение IllegalArgumentException, так же, как выувидел.(Я полагаю, что эта проверка по карте является функцией безопасности для предотвращения атак на основе SQL со стороны людей, злоупотребляющих вашим поставщиком контента, но это только предположение.)
Обратите внимание, что если вы устанавливаете "строгие" проекционные карты вВаш построитель запросов:
qb.setStrictProjectionMap(true);
Тогда в этом случае он ожидает, что вы будете знать точные имена столбцов ... Если вы не установите его, он проверяет псевдоним столбца "AS" - я думаю,это объясняет «странное исправление», которое вы обнаружили.
Надеюсь, это поможет.