jueves, 26 de noviembre de 2015

Introducción a SQLite en Android

Una pequeña introducción teórica antes de poner las manos en el código.

SQLite es un sistema de gestión de bases de datos que ha triunfado, sobre todo en entornos embebidos y esta presente no sólo en Android, sino también en iOS y en Blackberry y en un montón de sistemas con "relativamente" poca potencia.

Las características que hacen SQLite como la base de datos más popular en dispositivos móviles, entre otras son:
  • Consume muy poca memoria.
  • Fácil de usar.
  • Es de Libre Disponibilidad


¿Por qué es fácil de usar? Porque simplemente funciona sin complicaciones.
  • No es necesario una instalación
  • No es necesario configurar.
  • No requiere un proceso de servidor que necesite arrancar o parar.
  • No usa archivos de configuración, es un sólo archivo para todo el sistema de la base de datos.
  • Utiliza muy pocos tipos de datos.

Tipos de datos en SQLite.


Soporta muy pocos tipos de datos, por ejemplo no soporta el "archiconocido" VARCHAR.

Soporta los siguientes tipos:

  • NULL: como valor nulo.
  • INTEGER: valor Entero con signo, alojado entre 1-8 bytes dependiendo de la magnitud del valor.
  • REAL: valor real
  • TEXT: valor de texto codificado en UTF-8, UTF-16BE o UTF-16LE
  • BLOB: (Binary Large Objects) o datos de gran tamaño, generalmente imágenes, sonido, vídeo...

Por lo tanto, si hemos trabajado con otras bases de datos en las cuales disponíamos de mayor variedad, ahora debemos buscar una afinidad con los tipos de datos anteriores, por ejemplo para un BIGINT O UN TINYINT usaremos en SQLite INTENGER, en los casos de CHARACTER, VARCHAR, NCHAR, utilizaremos el tipo de dato TEXT. En la documentación oficial, tenemos una tabla de afinidad con otros tipos de datos y cómo trabaja con ellos.

¿Y las fechas, que sucede con las fechas en SQLite?

SQLite no tiene una clase especifica para almacenar este tipo de dato, pero SI PODEMOS TRABAJAR con fechas.
Las fechas se pueden almacenar en los siguientes tipos:
  • TEXT: como una cadena de texto según la ISO8601 ("AAAA-MM-DD HH: MM: ss.sss").
  • REAL:  como una fecha juliana, es decir, el número de días transcurridos desde el mediodía del 1 de enero del año 4713 a. C. ( por ejemplo el 1 de enero del 2000 correspondería con el valor 2451545)
  • INTEGER: como hora en Unix, el número de segundos desde 1970-01-01 00:00:00 UTC.
Además disponemos de diversas funciones para trabajar con ellas.


Los Límites de SQLite.

Para una aplicación de un dispositivo móvil, no deben preocuparnos. Pero algunos de los límites son:
  • Longitud máxima de una cadena o un BLOB, por defecto es 1 billón de bytes.
  • El número máximo de columnas por defecto es 2000 (configurable a 32767) aunque un buen diseño por muy complejo que sea se estima que no debe superar las 100.
  • Tamaño máximo de la base de datos son 140 Terabytes. Aunque no se han realizado pruebas con valores superiores por que los desarrolladores no tienen acceso a un hardware de esas características. Sin embargo, se comporta correctamente cuando alcanza el tamaño máximo del sistema de archivos del sistema operativo que contiene la base de datos. En Android el sistema de ficheros mas común es YAFFS que no se acerca ni de lejos.
  • El número máximo de filas en una tabla es 264 que es teóricamente inalcanzable ya que llegaríamos antes a límite del tamaño de la base de datos.
  • El numero máximo de tablas está sobre los 2 billones.
Como podéis observar, son límites que no deben preocuparnos en absoluto y los he puesto a modo informativo.

INTEGRIDAD REFERENCIAL EN SQLITE


SQLITE si soporta la integridad referencial desde la versión 3.6.19, aunque por defecto está desactivado.

¿Qué es la integridad referencial?

Lo mejor es explicarlo con un ejemplo de la mano de la documentación oficial. Supón que tenemos un tabla con los nombres de cantantes o artistas, con los campos, id_artista y nombre, y otra tabla con las canciones, cuyos campos son, id_cancion, nombre, e id_artista. 
En este ejemplo suponemos que no puede haber ninguna canción que no sea asignada a un artista, es decir, no hay ninguna canción cuyo artista sea desconocido o si lo hubiese sería name="desconocido".

Tenemos los siguientes datos en la tabla artistas:
id - name
1 Dean Martin
2 Frank Sinatra

y los siguientes datos en la tabla canciones:

id_cancion | nombre_cancion | id_artista
    1              Christmas Blues      1
    2              May Way               2

la integridad referencial no permite incluir por ejemplo  3| Nothing Else Matters| 3 (de Metallica) ya que no existe el artista Metallica en nuestra tabla artistas. Además tampoco nos dejaría borrar el artista 2 Frank Sinatra mientras exista una referencia a él en la tabla canciones, se produciría un error:
SQL error: foreign key constraint failed


VERSIONES DE SQLITE EN ANDROID

Android y SQLite
Aunque SQLite si soporta la integridad referencial en versiones superiores de SQLite 3.6.19 por defecto viene desactivado, por lo tanto es importante conocer que versión de SQLite corresponde con la versión de Android, si queremos soporte para esta caracteristica.

Si utilizamos el comando sqlite --version en el emulador nos dan los siguientes resultados:

SQLite 3.7.11:
  • 18-4.3-Jelly Bean
  • 17-4.2-Jelly Bean
  • 16-4.1-Jelly Bean
SQLite 3.7.4:
  • 15-4.0.3-Ice Cream Sandwich
  • 14-4.0-Ice Cream Sandwich
  • 13-3.2-Honeycomb
  • 12-3.1-Honeycomb
  • 11-3.0-Honeycomb
SQLite 3.6.22:
  • 10-2.3.3-Gingerbread
  • 9-2.3.1-Gingerbread
  • 8-2.2-Froyo
SQLite 3.5.9:
  • 7-2.1-Eclair
  • 4-1.6-Donut
  • 3-1.5-Cupcake
Esto puede variar en diferentes dispositivos, en los que el fabricante hace modificaciones.

En resumen las versiones superiores de SQLite 3.6.19 están presentes a partir de la API 8 de Android en concreto Android Froyo 2.2.

En próximos tutoriales del Curso de Programación de Aplicaciones Android veremos como trabajar con este tipo de bases de datos.

Entradas Relacionadas:


No hay comentarios:

Publicar un comentario