Android: la columna ‘_id’ no existe

Estoy recibiendo este error

IllegalArgumentException: la columna ‘_id’ no existe

Cuando uso un SimpleCursorAdapter para recuperar de mi base de datos, y la tabla sí 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. Esta es mi consulta de cursor:

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

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

Su base de datos no tiene que tener una columna llamada ‘_id’, pero SimpleCursorAdaptor necesita tener una devuelta. Puedes hacer esto con un alias.

Un ejemplo es que tengo una tabla con columnas …

 uid,name,number 

Para consultar esto para un SimpleCursorAdapter, hago esto con una base de datos rawQuery

 SELECT uid as _id,name,number FROM MY_TABLE 

Esto funciona bien y proporciona la columna ‘_id’ necesaria para SimpleCursorAdapter.

EDITAR: Por lo que yo entiendo, el campo _id se utiliza como una clave única para garantizar que los datos que maneja el cursor se manejen correctamente mediante adaptadores y adaptadores, etc.

Mire el modelo de datos en los documentos para proveedores de contenido .

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 simplificar las cosas 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. 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’.

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. Debe corregir lo siguiente también:

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

El argumento int [] es una matriz de identificadores de vista para poblar con valores del cursor. El argumento String [] es una matriz de nombres de columna de una fila a la que apunta el cursor.

Debe tener una cantidad igual 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.

Además, de acuerdo con JavaDoc for SimpleCursorAdapter, ese constructor está en desuso porque hace que las consultas se ejecuten en el hilo de la interfaz de usuario. Cual es malo. Use este 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 simple sería agregar “, 0” al final de la lista de argumentos.

Si está tratando de usar una base de datos sqlite existente en su aplicación Android, entonces necesita hacer algunos preparativos para que funcione correctamente. Esta publicación de blog describe el proceso en detalle.

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/