2010-07-16 29 views
7

He creado una vista personalizada en una base de datos SQLite para una aplicación de Android.
Estoy usando Sqliteman en Ubuntu para probar mis declaraciones SQL antes de ponerlas en mi aplicación.
Estoy tratando de hacer una simple declaración de selección en mi vista.
La instrucción select funciona bien en SQLiteman, pero cuando pongo la misma instrucción en mi código, arroja un error.SQLite para vista de tabla personalizada de Android (vista SQL, no vista de Android) discrepancia?

La declaración:

select * from item_view where parent_item_id = 0; 

La vista (convertido a Java como un String):

"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" 

El error:

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 

primera vez que trató de llamar al elemento de campo. parent_item_id en mi declaración seleccionada, pero eso no funcionó.
Luego saqué el db y lo abrí con Sqliteman.
Los campos se enumeraron como estaban en las tablas originales (_id, estado, nombre, etc.)
Así que ejecuté el SQL anterior en Sqliteman y pude recuperar los datos apropiados sin problema, pero no puedo obtenerlo para trabajar en mi aplicación de cualquier manera.
También noté que abandonar la vista como un comando DROP TABLE funcionaba en SQLiteman pero no en mi aplicación.
Me pregunto si es posible que me falte alguna otra funcionalidad específica de VIEW.
No vi ninguno en la documentación de Android ni en ninguna documentación de SQL.

Técnicamente podría hacer esto con una llamada SQL más compleja utilizando las tablas originales, pero todas mis tablas siguen ciertas pautas para que pueda generar dinámicamente llamadas SQL. Me gustaría que las tablas de vistas funcionen para mantener mi código uniforme y siempre reutilizando las mismas llamadas para evitar el mantenimiento y otros problemas de errores del código duplicado.

Respuesta

18

Resulta que debe nombrar específicamente cada campo que está creando para que android pueda tratarlo como una tabla normal. La solución ...

"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" 
+4

¡No puedo hacer hincapié en lo mucho que me ha ayudado! Me he estado arrancando el pelo durante dos horas tratando de descubrir por qué el maldito androide no puede encontrar la columna que * absulutely * existe. – Valentin

Cuestiones relacionadas