Acerca del campo “_id” en Android SQLite

¿Es necesario el campo “_id” en Android SQLite?

_id es útil cuando está utilizando adaptadores mejorados que utilizan un Cursor (por ejemplo, ResourceCursorAdapter). Es utilizado por estos adaptadores para proporcionar una identificación que se puede utilizar para referirse a la fila específica en la tabla que relaciona el elemento en cualquier adaptador que se use (por ejemplo, una fila en un ListView).

No es necesario si no va a utilizar clases que necesitan una columna _id en un cursor, y también puede usar “como _id” para hacer que otra columna aparezca como si se llamara _id en el cursor.

¿Por qué no hacer uso de _ROWID_ ?

SQLite proporciona esto de todos modos para cada fila, por lo que puede alisarlo en _id en su instrucción seleccionada.

Técnicamente, no se requiere el campo _id , sin embargo, si está utilizando la clase CursorAdapter (que probablemente sea, especialmente si está trabajando con el ejemplo del Bloc de notas), entonces sí

“El Cursor debe incluir una columna llamada” _id “o esta clase no funcionará”

como se explica en la documentación aquí . Lamentablemente, los ejemplos del código no lo dejan muy claro.

En muchos casos, es bastante conveniente tener un campo de identificación. Prefiero que el mío aumente automáticamente (como se muestra a continuación). Siempre encuentro nuevos usos para el campo de identificación 🙂

Cuando llega el momento de adjuntar los datos a un adaptador, me gusta usar un alias de nombre de tabla para consultar el campo de id como _id . Ejemplo: SELECT id _id, msg from message order by id . De esta forma, el adaptador ve un campo llamado _id y todo el mundo está contento.

Aquí hay una muestra de cómo defino mis tablas:

 CREATE TABLE message (_id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, tripID TEXT, msg TEXT); 

De los documentos oficiales …

El Cursor debe incluir una columna llamada “_id” o esta clase no funcionará. Además, el uso de MergeCursor con esta clase no funcionará si los cursores combinados tienen valores superpuestos en sus columnas “_id”.

Y el Cursor es:

Esta interfaz proporciona acceso aleatorio de lectura y escritura al conjunto de resultados devuelto por una consulta de base de datos.

En otras palabras, necesitas _id para Android SQLite (que generalmente usa Cursor)

Si define su columna _id como un entero autoincrementing, en realidad es un alias para la columna ROWID que proporciona SQLite de forma predeterminada ( https://www.sqlite.org/lang_createtable.html#rowid ).

Tu statement de creación necesita tomar la forma …

 CREATE TABLE t(_id INTEGER PRIMARY KEY ASC, y, z); 

Para probar esto funciona …

 UPDATE t SET _id=22 WHERE _id=11; 

entonces

 SELECT ROWID, _id FROM t; 

y encontrará que _id y ROWID tienen el mismo valor.

Tenga en cuenta que si utiliza DESC en CREATE, se crea una nueva columna y ROWID no tiene alias.

Seguramente no. Es un campo práctico que algunos widgets como ListView utilizan para rellenar datos. Vea este buen artículo: http://www.casarini.org/blog/2009/android-contentprovider-on-sqlite-tables-without-the-idcolumn/

Por supuesto, si está creando su propio widget de interfaz de usuario y su propio adaptador, no tiene que nombrar su clave principal como “_id”. Puede ser cualquier nombre que desee. Pero usted sería responsable de administrar sus colecciones de widgets UI y vincularlos a la fila correcta en su base de datos. “_id” solo es útil para ListView como ha señalado Brad.