2011-04-28 20 views
7

estoy recibiendo este errorAndroid: la columna '_id' no existe

IllegalArgumentException: la columna '_id' no existe

Cuando se utiliza un SimpleCursorAdapter recuperar de mi base de datos, y la tabla realmente tiene esta columna _id. Al notar que este es un problema común, he intentado evitarlo dado algunas de las soluciones en línea, pero ninguna de ellas funciona. Este es mi cursor de consulta:

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.quoterow, myCursor, new String[]{"_id", "quote"}, new int[]{R.id.quote}); 

aunque debo mencionar el original no incluía la columna de la _id, añadí esto recientemente para tratar de resolver el problema. ¿Alguien ha tenido alguna idea que pueda ayudar a resolver el problema?

Respuesta

15

Su base de datos no tiene que tener una columna llamada '_id' pero el SimpleCursorAdaptor no necesita tener uno regresó. Puedes hacer esto con un alias.

Un ejemplo es que tengo una tabla con columnas ...

uid,name,number 

Para consultar esto por un SimpleCursorAdapter, lo hago con una base de datos rawQuery ...

SELECT uid as _id,name,number FROM MY_TABLE 

Estos trabajos bien y proporciona la columna '_id' necesaria para SimpleCursorAdapter.

EDIT: Por lo que yo entiendo que el campo _id se utiliza como una clave única para asegurarse de que los datos de las manijas del cursor pueden ser manejados correctamente por los adaptadores y adapterviews etc.

mirada en el modelo de datos en los documentos para Content Providers.

Usar una clave única en 'bases de datos' de cualquier tipo es prácticamente práctica universal, y hasta donde puedo decir, el uso del nombre de columna '_id' (o '_ID') es simplemente una forma de estandarizar y simplificando cosas en bases de datos, proveedores de contenido, cursores, adaptadores, etc.

En resumen, para que estos diversos componentes funcionen correctamente, necesitan una columna de datos con valores únicos, pero también deben 'saber' cuál es el nombre de esa columna es No 'sabrían', por así decirlo, que mi nombre de columna 'uid' es el que necesitan en lugar de mis columnas 'nombre' y 'número'.

+0

Hola, señorSquonk, he cambiado el código a rawQuery y ya no aparece el mensaje de error _id de la columna. ¿Podría explicar por qué el adaptador de cursor necesita tener este _id explicado ya que no puedo encontrarle sentido en mi mente? – MindDrip

+0

@MindDrip: Ver el EDIT en mi respuesta. – Squonk

+0

¡simplemente renombro mi columna task_id usando un alias y un problema resuelto! task_id como _id – Rasel

0

O bien no tiene una columna "_id" en su tabla o no la está incluyendo en su consulta. Eso es lo que está causando la excepción. Es necesario que se fija la siguiente así:

Su último argumento para el constructor CursorAdapter falta la columna de referencia para _id.

El int [] argumento es un array de vista ids para rellenar con los valores del cursor. El argumento String [] es una matriz de nombres de columna de una fila a la que apunta el cursor.

Debe tener la misma cantidad de valores en la matriz from como lo hace en la matriz. Porque los datos del Cursor se toman del cursor y se colocan en las vistas. Si no hay un número igual de valores en cada matriz, el adaptador lanza una excepción porque no tiene la cantidad correcta de información para asignar los datos a las vistas.

También, de acuerdo con el Javadoc para SimpleCursorAdapter, que constructor está en desuso debido a que causa consultas para ser ejecutados en el hilo de interfaz de usuario. Cual es malo. Utilizar éste en su lugar:

http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html#SimpleCursorAdapter%28android.content.Context,%20int,%20android.database.Cursor,%20java. lang.String [], 20int% [],%% 20int 29

Una solución sencilla sería la de añadir", 0" al final de la lista de argumentos.

+0

Hola Adam, ¿podría explicar esto con más detalle por favor, la última arg en el adaptador de cursor es, ¿por qué esta necesidad de Referencia _ID? – MindDrip

+0

He intentado utilizar el cursor que sugirió, pero extrañamente no aceptará la int al final, así que no puedo probar su sugerencia. – MindDrip

+0

añadí otro párrafo de mi respuesta .. – adam

Cuestiones relacionadas