Almacenamiento de Datos
Curso Android
- Preferencias: Es un mecanismo liviano que permite almacenar y recuperar datos primitivos en la forma de pares clave/valor. Este mecanismo se suele utilizar para almacenar los parámetros de configuración de una aplicación.
- Ficheros: Puedes almacenar los ficheros en la memoria interna del dispositivo o en un medio de almacenamiento removible como una tarjeta SD. También puedes utilizar fichero añadidos a tu aplicación como recursos.
- XML: Se trata de un estándar fundamental para la representación de datos, en Internet y en muchos otros entornos (como en el Android SDK). En Android disponemos de las librerías SAX y DOM para manipular datos en XML.
Alternativas para guardar datos permanentemente en Android
- Base de datos: Las APIs de Android contienen soporte para SQLite. Tu aplicación puede crear y usar base de datos SQLite de forma muy sencilla y con toda la potencia que nos da el lenguaje SQL.
- Proveedores de contenidos: Un proveedor de contenidos es un componente opcional de una aplicación que expone el acceso de lectura / escritura de sus datos a otras aplicaciones. Está sujeto a las restricciones de seguridad que quieras imponer. Los proveedores de contenido implementan una sintaxis estándar para acceder a sus datos mediante URI (Uniform Resource Identifiers) y un mecanismo de acceso para devolver los datos similar a SQL. Android provee algunos proveedores de contenido para tipos de datos estándar, tales como contactos personales, ficheros multimedia, etc.
- Internet: No te olvides que también puedes usar la nube para almacenar y recuperar datos.
Base de Datos
- Android incorpora la librería SQLite, que nos permitirá utilizar bases de datos mediante el lenguaje SQL, de una forma sencilla y utilizando muy pocos recursos del sistema.
- SQL es el lenguaje de programación más utilizado para bases de datos.
SQLiteOpenHelper
- Usaremos la clase abstracta SQLiteOpenHelper, que nos facilita tanto la creación automática de la base de datos como el trabajar con futuras versiones de esta base de datos.
- Para crear un descendiente de esta clase hay que implementar los métodos onCreate() y onUpgrade(), y opcionalmente, onOpen().
- La gran ventaja de utilizar esta clase es que ella se preocupará de abrir la base de datos si existe, o de crearla si no existe. Incluso de actualizar la versión si decidimos crear una nueva estructura de la base de datos.
- Esta clase tiene dos métodos: getReadableDatabase() y getWritableDatabase(), que abren la base de datos en modo solo lectura o lectura y escritura. En caso de que todavía no exista la base de datos, estos métodos se encargarán de crearla.
El constructor de la clase:
SQLiteOpenHelper(Context contexto, String nombre, SQLiteDatabase.CursorFactory cursor, int version).
Los parámetros se describen a continuación:
contexto: Contexto usado para abrir o crear la base de datos.
nombre: Nombre de la base de datos que se creará.
cursor: Se utiliza para crear un objeto de tipo cursor.
version: Número de versión de la base de datos empezando desde 1. En el caso de que la base de datos actual tenga una versión más antigua se llamará a onUpgrade() para que actualice la base de datos.
El método onCreate(): se invocará cuando sea necesario crear la base de datos. Como parámetro se nos pasa una instancia de la base de datos que se acaba de crear. Este es el momento de crear las tablas que contendrán información.
El método onUpgrade(): si más adelante decidimos crear una nueva estructura para la base de datos, tendremos que indicar un número de versión superior, por ejemplo la 2. Cuando se ejecute el código sobre un sistema donde se disponga de una base de datos con la versión 1, se invocará el método onUpgrade(). En él tendremos que escribir los comandos necesarios para transformar la antigua base de datos en la nueva, tratando de conservar la información de la versión anterior.
Los métodos query() y rawQuery()
Cursor SQLiteDatabase.query (
Stringtable, //tabla a consultar (FROM)
String[] columns, //columnas a devolver (SELECT)
Stringselection, //consulta (WHERE)
String[] selectionArgs,//reemplaza “?” de la consulta
StringgroupBy, //agrupado por (GROUPBY)
Stringhaving, //condición para agrupación
StringorderBy, //ordenado por
Stringlimit) //cantidad máx. de registros
Cursor SQLiteDatabase.rawQuery(
Stringsql, //comando SQL
String[] selectionArgs)//reemplaza “?”de la consulta
Supongamos que hemos creado la tabla, tabla, y que tiene las columnas texto, entero y numero.
Si quisiéramos seleccionar:
- las columnas texto y entero de las filas
- con el valor de numero mayor que 2,
- ordenados según el valor de entero
- que además el número de filas seleccionadas estuviera limitado a un máximo de cantidad. (donde cantidad ha de ser una variable de tipo entero previamente definida), escribiríamos:
Ejemplos
Cursor cursor = db.rawQuery("SELECT texto, entero FROM tabla"+
" WHERE numero>2 ORDER BY entero LIMIT "+ cantidad,null);Cuando uno está acostumbrado al lenguaje SQL esta puede ser la forma más sencilla de hacer la consulta. De forma alternativa podemos hacer uso del segundo parámetro. Este ha de ser un array de String, de forma que estos Strings reemplazan cada una de las apariciones del carácter “?” en la cadena del primer parámetro. Veamos un ejemplo que sería equivalente al anterior:
String[] param = new String[1];
param[0]= Integer.toString(cantidad,10);
Cursor cursor = db.rawQuery("SELECT texto, entero FROM tabla" +
" WHERE numero>2 ORDER BY entero LIMIT ?", param);Si en lugar de método rawQuery() queremos utilizar el método query() usaríamos el siguiente código equivalente a los dos anteriores:
String[] CAMPOS = {"texto", "entero"};
Cursor cursor = db.query("tabla", CAMPOS, "numero>2”, null,
null, null, "entero", Integer.toString(cantidad));Adaptadores para Base de Datos
Un adaptador (Adapter) es un mecanismo de Android que hace de puente entre nuestros datos y las vistas contenidas en un ListView (o un GridView o Spinner). Dado que es muy frecuente usar bases de datos e nuestras aplicaciones, existen adaptadores específicos para este caso. La forma de trabajar habitual es hacer una consulta en una base de datos (comando SQL SELECT) y obtener un objeto Cursor con el resultado. Este objeto será pasado al adaptador para que lo recorra y cree tantas vistas como registros se hayan encontrado.
La forma más sencilla de pasar los datos del Cursor obtenido en una consulta a un ListView es utilizar la clase SimpleCursorAdapter
adaptador = new SimpleCursorAdapter(this,
R.layout.elemento_lista,
Lugares.listado(),
new String[] { "nombre", "direccion"},
new int[] { R.id.nombre, R.id.direccion},
0);- contexto de nuestra aplicación
- un layout con el diseño básico que queremos repetir
- un objeto Cursor con una consulta a nuestra base de datos
- una lista con los nombres de los registros que queremos visualizar en cada layout
- una lista con los id de recurso de los elementos del layout donde queremos visualizar estos datos
- finalmente un campo de opciones.
Este tipo de adaptador tiene una restricción, los id de los elementos a reemplazar solo pueden ser del tipo TextView o ImageView. Por lo que cosas más complejas como modificar el valor de un RatingBar no son posibles.
Cuando queramos definir un Adaptador sin ningún tipo de restricciones aprendimos a extender la clase BaseAdapter. A continuación aprenderemos a usar otra clase sin restricciones, pero que nos facilita mucho del trabajo a realizar cuando los datos a mostrar vienen de un objeto Cursor. Se trata de la clase CursorAdapter.
Almacenamiento
By Marina Garcia
Almacenamiento
- 672