2011-05-18 8 views
8

Tengo una aplicación para Android, y todas mis pruebas hasta ahora han estado en mi teléfono Froyo. Acabo de comenzar a probar contra 1.6 y 2.1 en el emulador, y se bloquea al inicio. No puede encontrar una columna en una de mis vistas.Diferencias de SQLite entre Android 2.1 y 2.2

05-17 23:31:31.446: ERROR/AndroidRuntime(198): Caused by: 
android.database.sqlite.SQLiteException: no such column: 
categoryTable.currentBal: , while compiling: 
SELECT SUM(categoryTable.currentBal) FROM catDisplayTable 
WHERE masterCategoryName != "__Hidden__" 

El esquema de la vista es el siguiente:

CREATE VIEW catDisplayTable AS SELECT categoryTable._id, categoryTable.name, 
categoryTable.currentBal, categoryTable.sequence, categoryTable.note, 
masterCategoryTable.name AS masterCategoryName FROM categoryTable 
LEFT OUTER JOIN masterCategoryTable 
ON categoryTable.masterCategoryId = masterCategoryTable._id; 

Con adb shell la conexión a los distintos casos de emulador, he confirmado que (1) el esquema correcto está en su lugar en todos los casos, y (2) en 1.6 y 2.1, SQLite es simplemente incapaz de localizar las columnas de esta vista, incluso con algo tan simple como

SELECT categoryTable.name FROM catDisplayTable; 

o

SELECT name FROM catDisplayTable; 

Funciona bien en 2.2.

Mi presunción, por lo tanto, es que algo ha cambiado en SQLite entre Android 2.1 y 2.2. This answer útilmente da las versiones de SQLite que se enviaron con cada nivel de la API de Android. Dice que SQLite se actualizó de 3.5.9 a 3.6.22 entre 2.1 y 2.2. En cuanto a the SQLite release history, no veo nada particularmente obvio que pueda explicar la diferencia.

¿Alguien puede identificar exactamente qué ha cambiado y sugerir cómo puedo evitarlo para que mi código funcione en dispositivos anteriores a Froyo?

+0

I Estoy tratando de asegurarme de que no te saltees obvio. ¿"Limpiaste los datos" en el emulador/dispositivo antes de intentar? ¿Tal vez tienes una versión dev más antigua y esta vista no tiene una columna en ese emulador/dispositivo? – katit

+0

@katit Sí, completamente limpio. Creé nuevas AVD vacías específicamente para probar esto. –

Respuesta

2

que tienen exactamente el mismo problema en mi aplicación. El denominador común es que también uso Views y tengo claves foráneas.

He descargado mi base de datos del emulador. No tengo problemas para ejecutar la consulta fuera del sistema operativo Android 2.1.

Dio la respuesta de mp2526, pero consultar con "columnx AS columnx" no hizo diferencia. Trataré de aislar el problema.

+0

Si ejecuto la misma consulta que en la vista independiente, funciona bien. Tal vez ya era obvio, pero en _un alto nivel_ es la combinación de Views y Android 2.1 que no funciona bien. – Magnus

+0

Acepto, finalmente resolví mi problema reconstruyendo mis consultas para evitar las Vistas. –

+0

Sí, así es como lo resolví también al final. Supongo que no es gran cosa, pero parece más fácil administrar vistas en la base de datos. Seguí el error hasta la implementación de la plataforma nativa de la consulta. Eso fue suficiente para que decidiera que no valía la pena buscar algún tipo de API mágica en Java. – Magnus

7

Me he encontrado con un problema con SQLite cuando uso DISTINCT que tal vez el mismo problema que se está ejecutando con SUM.

En las versiones anteriores del SO cuando usaba DISTINCT, tenía que alias los nombres de las columnas o la lógica fallaba con un error similar, si no exactamente el mismo (no recuerdo exactamente cuál fue el error), pero supongo que lo arreglé en versiones posteriores del sistema operativo.

ejemplo

SELECT DISTINCT _id AS _id, test AS test FROM table 

obras para todas las versiones del sistema operativo, mientras que

SELECT DISTINCT _id, test FROM table 

fallaría para sistemas operativos anteriores

+0

Tengo una aplicación que admite v2.1 y superior. Agregué una vista a la aplicación que era una combinación de uniones de consultas unidas. La vista funcionó bien en v2.2 y superior, pero no en v2.1. En cada una de las subconsultas, hice un alias de cada columna, y eso permitió que la vista funcionara en v2.1. GRACIAS por el consejo ... ¡funcionó muy bien! –

0

Acabo de pasar por el mismo problema. SÍ FUNCIONA cuando rehice la declaración de vista utilizando anotaciones de Columnas AS.

0

El problema es que Android 2.1 devuelve las columnas junto con sus nombres de tabla, por lo que una consulta como

SELECT id FROM table 

devolverá una columna con el nombre table.id

La solución, como ya se ha señalado, es escribir

SELECT id as id FROM table 
+0

Sus declaraciones no son lo suficientemente claras y parecen no ser una respuesta. Utilice las respuestas SO solo para publicar respuestas; de lo contrario, coméntelas. Por favor, eche un vistazo a nuestro 'tour' en el menú' help'. – Alexey

+0

Como dijo, la solución ya está provista, no es necesario hacer una nueva respuesta. – djv

+0

#rvighne - gracias amigo – user3866289

Cuestiones relacionadas