Несоответствие пользовательского представления таблиц SQLite для Android (SQL View, а не Android)? - PullRequest
7 голосов
/ 17 июля 2010

Я создал пользовательское представление в базе данных SQLite для приложения Android.
Я использую Sqliteman в Ubuntu для проверки своих операторов SQL, прежде чем помещать их в свое приложение.
Я пытаюсьсделайте простой оператор select на мой взгляд.
Оператор select прекрасно работает в SQLiteman, но когда я помещаю в мой код то же выражение, оно выдает ошибку.

Оператор:

select * from item_view where parent_item_id = 0;

Представление (преобразованное в Java в виде строки):

"create view if not exists item_view as select " +
    "item._id, item.status, item.name, item.position, " +
    "item.parent_item_id, item.note_id, item.other_id, " + 
    "note.contents, other.priority " +
"from item, note, other where item.note_id = note._id and item.other_id = other._id"

Ошибка:

07-16 14:21:15.153: ERROR/AndroidRuntime(5054): Caused by: android.database.sqlite.SQLiteException: no such column: parent_item_id: , while compiling: SELECT * FROM item_view WHERE parent_item_id = 0

Сначала я попытался вызвать поле item.parent_item_id в своем операторе select, но это не сработало.
Затем я извлек базу данных и открыл ее с помощью Sqliteman.
Поля были перечислены в том виде, в котором они были в исходных таблицах_id, status, name и т. д.)
Так что я запустил SQL выше в Sqliteman и смог без проблем получить соответствующие данные, но я не могу заставить его работать в моем приложении в любом случае.
Я такжезаметил, что удаление представления как команды DROP TABLE работает в SQLiteman, но не в моем приложении.
Мне интересно, возможно, мне не хватает какой-то другой специфической функции VIEW.
Я не видел ни одной из нихДокументация Android или любая документация SQL, хотя.

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

1 Ответ

18 голосов
/ 27 октября 2010

Оказывается, вам нужно конкретно назвать каждое поле, которое вы создаете, чтобы android мог рассматривать его как обычную таблицу.Решение ...

"create view if not exists item_view as select " +
    "item._id as _id, item.status as item_status, item.name as item_name, item.position as item_position, " +
    "item.parent_item_id as item_parent_item_id, item.note_id as item_note_id, item.other_id as item_other_id, " + 
    "note.contents as note_contents, other.priority as other_priority " +
"from item, note, other where item.note_id = note._id and item.other_id = other._id"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...