Acerca del campo "_id" en Android SQLite

Es el campo "_id" necesario en Android SQLite?

_id es útil cuando se utilizan los adaptadores mejorados que hacen uso de un cursor (por ejemplo, ResourceCursorAdapter). Es utilizado por estos adaptadores para proporcionar una ID que se puede utilizar para referirse a la fila específica en la tabla que relaciona el elemento en lo que el adaptador se está utilizando para (por ejemplo, una fila en un ListView).

No es necesario si no vas a usar clases que necesitan una columna _id en un cursor, y también puedes usar "as _id" para hacer que aparezca otra columna como si se llamara _id en tu cursor.

¿Por qué no hacer uso de _ROWID_ ?

SQLite proporciona esto de todos modos para cada fila, por lo que sólo puede alias a _id en su declaración de selección.

Técnicamente no el campo _id no es necesario, sin embargo, si está haciendo uso de la clase CursorAdapter (que probablemente lo son, 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 de código no lo hacen muy claro.

Es muy conveniente en muchos casos tener un campo id. Prefiero que el mío se auto-incremente (como se muestra a continuación). Siempre estoy encontrando nuevos usos para el campo id 🙂

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

He aquí un ejemplo 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, utilizar 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 de lectura-escritura aleatorio al conjunto de resultados devuelto por una consulta de base de datos.

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

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

Su declaración 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ás 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 de conveniencia que algunos widgets como ListView utiliza para rellenar datos. Vea este buen artículo: http://www.casarini.org/blog/2009/android-contentprovider-on-sqlite-tables-without-the-_id-column/

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

  • Base de datos no copiar desde activos
  • Manejo de bases de datos con 2 procesos
  • ¿Cómo descargar una base de datos SQLite desde un dispositivo Android?
  • No se puede abrir la base de datos-Android
  • Compruebe que la base de datos sqlite está abierta o cerrada en android
  • ¿Cuán cuidado debo tener con el hilo de seguridad al crear métodos / actividades que interactúan con la base de datos SQLite?
  • Cómo obtener el registro de llamadas desde fecha específica en android
  • Android: Guardar imágenes en la base de datos Sqlite
  • Utilización de la base de datos legible y escrita de SQLite
  • Sqlite base de datos en el idioma persa
  • Cursor finalizado sin advertencia previa de cierre (). ¿Qué significa eso?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.