¿Qué base de datos usa Kotlin?

SQLite en Android: Clases Clave

Valoración: 4.26 (7530 votos)

En el dinámico mundo del desarrollo de aplicaciones móviles para Android, la capacidad de almacenar y gestionar datos localmente es una necesidad fundamental. Ya sea para guardar preferencias de usuario, información de la aplicación sin conexión, o cualquier otro tipo de dato, contar con una solución de base de datos eficiente y ligera es crucial. Android viene equipado con una potente herramienta para este propósito: SQLite.

SQLite es una base de datos relacional de código abierto que destaca por ser embebible y sin servidor. Esto significa que la base de datos se integra directamente en la aplicación, sin necesidad de un proceso de servidor separado ejecutándose en el dispositivo. Su diseño compacto y su facilidad de integración la convierten en la opción ideal para aplicaciones móviles y sistemas embebidos.

¿Qué aplicaciones utilizan base de datos?
Las bases de datos relacionales se utilizan para dar soporte a muchos tipos de aplicaciones, incluyendo el comercio electrónico, seguimiento de inventario, aplicaciones de gestión de relaciones con los clientes y muchas más.

Para interactuar con una base de datos SQLite en Android de manera eficiente y estructurada, se utilizan varias clases proporcionadas por el framework. Las dos clases más importantes y que todo desarrollador Android debe conocer son `SQLiteOpenHelper` y `SQLiteDatabase`.

Índice de Contenido

El Pilar: La Clase SQLiteOpenHelper

La clase `SQLiteOpenHelper` es fundamental para la gestión de la base de datos SQLite en Android. Su propósito principal es simplificar el proceso de creación, apertura y actualización de la base de datos. En lugar de manejar directamente los archivos de la base de datos y las complejidades de la gestión de versiones, se delega esta tarea a una subclase personalizada de `SQLiteOpenHelper`.

Al crear una clase que extiende `SQLiteOpenHelper`, debes implementar dos métodos abstractos clave:

  • onCreate(SQLiteDatabase db): Este método se invoca solo una vez, la primera vez que se intenta acceder a la base de datos (ya sea para leer o escribir) y esta no existe. Dentro de este método, debes definir el esquema de tu base de datos, lo que implica crear las tablas necesarias utilizando sentencias SQL como CREATE TABLE. La instancia de SQLiteDatabase que se pasa como argumento es la base de datos recién creada sobre la cual puedes ejecutar estas sentencias.

  • onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion): Este método se llama cuando la versión de la base de datos (especificada en el constructor de tu SQLiteOpenHelper) cambia a un número mayor. Es crucial para gestionar las actualizaciones del esquema de la base de datos. Aquí debes escribir el código SQL necesario para migrar los datos existentes de la versión antigua a la nueva, modificar tablas (agregar columnas, cambiar tipos, etc.), o incluso eliminar y recrear tablas si es apropiado (aunque la migración de datos es generalmente preferible). Se te proporcionan las versiones antigua y nueva para que puedas decidir el camino de actualización adecuado.

Además de estos métodos, `SQLiteOpenHelper` también facilita la obtención de instancias de `SQLiteDatabase` (para operaciones de lectura/escritura) y proporciona un método `close()` para cerrar la base de datos cuando ya no se necesita.

Operaciones con Datos: La Clase SQLiteDatabase

Mientras que `SQLiteOpenHelper` se encarga de la creación y gestión de versiones, la clase SQLiteDatabase es la que te permite realizar las operaciones de datos reales: Crear (Insertar), Leer (Consultar), Actualizar y Eliminar (CRUD).

Obtienes una instancia de `SQLiteDatabase` llamando a getWritableDatabase() o getReadableDatabase() en tu instancia de `SQLiteOpenHelper`. getWritableDatabase() te proporciona una instancia que permite operaciones de escritura y lectura. Si la base de datos está llena o solo necesitas leer, puedes usar getReadableDatabase(), que es ligeramente más eficiente y no bloqueará si la base de datos está ocupada.

La clase `SQLiteDatabase` ofrece una variedad de métodos convenientes para interactuar con la base de datos, que a menudo abstraen la necesidad de escribir sentencias SQL crudas para operaciones comunes:

  • execSQL(String sql): Este método ejecuta cualquier sentencia SQL que no sea una consulta SELECT y no devuelva datos. Es útil para sentencias como CREATE TABLE, DROP TABLE, ALTER TABLE, INSERT, UPDATE o DELETE cuando necesitas mayor flexibilidad.

  • insert(String table, String nullColumnHack, ContentValues values): Un método conveniente para insertar una nueva fila en una tabla. Tomas el nombre de la tabla y un objeto ContentValues que contiene los pares clave-valor de las columnas y sus valores a insertar.

  • update(String table, ContentValues values, String whereClause, String[] whereArgs): Permite actualizar filas existentes en una tabla. Especificas la tabla, los nuevos valores en un ContentValues, la cláusula WHERE para seleccionar las filas a actualizar, y los argumentos para la cláusula WHERE.

    ¿Qué base de datos se usa en Android?
    En Android hay varias posibilidades para trabajar con base de datos. Podemos utilizar un sistema embebido como SQLite o conectar de diversas formas a una bbdd externa, como MySQL.
  • delete(String table, String whereClause, String[] whereArgs): Elimina filas de una tabla basándose en una cláusula WHERE opcional.

  • query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy): Este es el método principal para realizar consultas SELECT. Permite especificar la tabla, las columnas a recuperar, la cláusula WHERE, GROUP BY, HAVING, y ORDER BY. Devuelve un objeto Cursor que puedes usar para iterar sobre los resultados.

Aunque `execSQL` te da control total, los métodos como `insert`, `update`, `delete` y `query` son generalmente preferibles porque manejan el escape de caracteres especiales y la seguridad de inyección SQL de manera más robusta cuando se usan con argumentos.

¿Cómo Trabajan Juntas en un Flujo Típico?

El flujo estándar para usar SQLite en Android implica:

  1. Crear una clase personalizada que extienda SQLiteOpenHelper.

  2. Implementar los métodos onCreate() y onUpgrade() en tu clase personalizada para definir y gestionar el esquema de la base de datos.

  3. En tu Activity, Fragment, o cualquier componente que necesite interactuar con la base de datos, crear una instancia de tu clase SQLiteOpenHelper personalizada.

  4. Llamar a getWritableDatabase() o getReadableDatabase() en la instancia de tu helper. Esto te devuelve una instancia de SQLiteDatabase y, si es necesario, dispara onCreate o onUpgrade.

  5. Utilizar la instancia de SQLiteDatabase obtenida para realizar operaciones CRUD (insertar, consultar, actualizar, eliminar) llamando a sus métodos correspondientes.

  6. Una vez que hayas terminado de interactuar con la base de datos, es crucial llamar al método close() en la instancia de tu SQLiteOpenHelper (o directamente en la instancia de SQLiteDatabase, aunque cerrar el helper es más común) para liberar los recursos del sistema.

Este patrón de diseño garantiza que la base de datos se cree correctamente la primera vez y se actualice de forma segura en versiones futuras de tu aplicación.

¿Qué es una aplicación de base de datos móvil?
Los dispositivos informáticos móviles (p. ej., teléfonos inteligentes y PDA) almacenan y comparten datos a través de una red móvil o acceden a una base de datos almacenada en el dispositivo móvil . Esta puede ser una lista de contactos, información de precios, distancia recorrida o cualquier otra información.

Conceptos Básicos: ¿Qué es una Clase en Android?

Aunque la información proporcionada sobre clases en Android se centra mucho en Kotlin y la programación orientada a objetos con ejemplos específicos (como la casa inteligente), podemos extraer el concepto fundamental relevante para entender `SQLiteOpenHelper` y `SQLiteDatabase`.

En el contexto de la programación orientada a objetos, que es el paradigma principal en el desarrollo Android, una clase es una especie de plano o plantilla para crear objetos. Define la estructura (datos o propiedades) y el comportamiento (funciones o métodos) que tendrán los objetos creados a partir de ella.

Un objeto es una instancia concreta de una clase. Siguiendo la analogía de la información proporcionada, si la clase es el plano de una casa, un objeto es la casa real construida a partir de ese plano, con sus características específicas (ubicación, color, número de habitaciones, etc.).

Así, `SQLiteOpenHelper` y `SQLiteDatabase` son clases predefinidas en el SDK de Android. Cuando usas `new YourCustomHelper()` (donde `YourCustomHelper` extiende `SQLiteOpenHelper`) o llamas a `helper.getWritableDatabase()`, estás creando o obteniendo objetos (instancias) de esas clases para poder utilizar las propiedades y métodos que definen (como `onCreate`, `insert`, `query`, etc.).

Tabla Comparativa: SQLiteOpenHelper vs SQLiteDatabase

CaracterísticaSQLiteOpenHelperSQLiteDatabase
Función PrincipalCreación, Apertura y Gestión de Versiones de la BDEjecución de Operaciones CRUD (SQL) sobre la BD
Relación con la BDGestiona el archivo de la base de datos y su esquemaRepresenta una conexión abierta a la base de datos
Instanciación TípicaSe crea una subclase personalizada y se instancia esa subclaseSe obtiene una instancia llamando a getWritableDatabase() o getReadableDatabase() en una instancia de SQLiteOpenHelper
Métodos Clave (Ejemplos)onCreate(db), onUpgrade(db, oldV, newV), close()execSQL(sql), insert(...), update(...), delete(...), query(...)
¿Maneja SQL directamente?Principalmente para definir el esquema en onCreate/onUpgrade (usando execSQL internamente)Sí, ejecuta sentencias SQL o proporciona métodos convenientes que las generan

Preguntas Frecuentes

¿Cuál es la clase principal para crear una base de datos SQLite en Android?
La clase principal que se utiliza como base para gestionar la creación inicial y las futuras actualizaciones de una base de datos SQLite en Android es SQLiteOpenHelper. Normalmente, creas tu propia clase que extiende esta.

¿Qué hace exactamente la clase SQLiteDatabase?
La clase SQLiteDatabase representa una conexión abierta a la base de datos. Es la clase que utilizas para ejecutar sentencias SQL o usar métodos convenientes para realizar operaciones de inserción, actualización, eliminación y consulta de datos.

¿Necesito extender SQLiteOpenHelper o puedo usarla directamente?
Aunque teóricamente podrías usarla directamente, la práctica estándar y recomendada es crear tu propia clase que extienda SQLiteOpenHelper. Esto te permite implementar la lógica específica para la creación inicial de tus tablas (en onCreate) y la gestión de versiones (en onUpgrade) de manera centralizada y organizada.

¿Cuándo se llama al método onCreate de mi SQLiteOpenHelper?
El método onCreate se llama únicamente la primera vez que se accede a la base de datos (ya sea a través de getWritableDatabase() o getReadableDatabase()) y el archivo de la base de datos no existe previamente en el dispositivo.

¿Qué ocurre si cambio el número de versión de la base de datos en mi SQLiteOpenHelper?
Si incrementas el número de versión en el constructor de tu SQLiteOpenHelper y luego intentas acceder a la base de datos (llamando a getWritableDatabase() o getReadableDatabase()), el sistema detectará que la versión actual es menor que la especificada en el código y automáticamente llamará al método onUpgrade de tu helper para que manejes la migración o actualización del esquema.

En resumen, para crear y gestionar una base de datos SQLite en Android, dependes fundamentalmente de la clase SQLiteOpenHelper para la estructura y SQLiteDatabase para las operaciones de datos. Comprender el rol de cada una y cómo trabajan juntas es clave para implementar almacenamiento local persistente en tus aplicaciones Android.

Si quieres conocer otros artículos parecidos a SQLite en Android: Clases Clave puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir