06 Herramientas Programacion Movil

HERRAMIENTAS DE PROGRAMACIÓN MÓVIL SEMANA 6 Manejo de datos en Android Todos los derechos de autor son de la exclusiv

Views 61 Downloads 0 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

HERRAMIENTAS DE PROGRAMACIÓN MÓVIL

SEMANA 6

Manejo de datos en Android

Todos los derechos de autor son de la exclusiva propiedad de IACC o de los otorgantes de sus licencias. No está permitido copiar, reproducir, reeditar, descargar, publicar, emitir, difundir, poner a disposición del público ni ESTE LAdeSEMANA 6 utilizarDOCUMENTO los contenidos paraCONTIENE fines comerciales ninguna clase.

1

ESTE DOCUMENTO CONTIENE LA SEMANA 6

2

ÍNDICE MANEJO DE DATOS EN ANDROID: SQLITE .......................................................................................... 4 OBJETIVOS ESPECÍFICOS ........................................................................................................................... 4 INTRODUCCIÓN ...................................................................................................................................... 4 1.

PERSISTENCIA DE DATOS: SQLITE................................................................................................ 5 1.1.

CREAR Y ABRIR LA BASE DE DATOS ..................................................................................... 5

1.2.

CREAR TABLAS ..................................................................................................................... 6

1.3.

ACTUALIZAR LA BASE DE DATOS ......................................................................................... 6

1.4.

ESCRIBIR EN LA BASE DE DATOS ......................................................................................... 7

1.5.

INSERTAR DATOS EN LA BASE DE DATOS ............................................................................ 7

1.6.

ACTUALIZAR DATOS EN LA BASE DE DATOS........................................................................ 8

1.7.

LEER DESDE LA BASE DE DATOS .......................................................................................... 8

1.8.

LEER FILAS DESDE LA BASE DE DATOS................................................................................. 8

1.9.

BORRAR DATOS DE LA BASE DE DATOS .............................................................................. 9

1.10. 2.

PERSISTENCIA DE DATOS: SHARED PREFERENCES .................................................................... 10 2.1.

3.

BORRAR LA BASE DE DATOS .......................................................................................... 10

ABRIR SHARED PREFERENCES ........................................................................................... 10

2.1.1.

ABRIR SHARED PREFERENCES DE LA ACTIVIDAD....................................................... 10

2.1.2.

ABRIR SHARED PREFERENCES POR DEFECTO ............................................................ 11

2.1.3.

ABRIR SHARED PREFERENCES GENÉRICAS ................................................................ 11

2.1.4.

AGREGAR Y EDITAR SHARED PREFERENCES .............................................................. 11

2.1.5.

LEER SHARED PREFERENCES...................................................................................... 12

2.1.6.

MONITOREAR CAMBIOS EN SHARED PREFERENCES ................................................. 12

PROVEEDORES DE CONTENIDOS (CONTENT PROVIDERS) ........................................................ 13 3.1.

CREAR UN CONTENT PROVIDER ........................................................................................ 13

3.2.

CONTRATO DE UN CONTENT PROVIDER ........................................................................... 15

3.3.

DECLARAR UN CONTENT PROVIDER ................................................................................. 15

3.4.

SEGURIDAD DE LOS CONTENT PROVIDERS ....................................................................... 16

3.5.

ACCEDER A UN PROVEEDOR DE CONTENIDOS ................................................................. 16

3.6.

CONTENT PROVIDERS DEL SISTEMA ................................................................................. 17

COMENTARIO FINAL.......................................................................................................................... 18 REFERENCIAS........................................................................................................................................ 19

ESTE DOCUMENTO CONTIENE LA SEMANA 6

3

MANEJO DE DATOS EN ANDROID: SQLITE OBJETIVOS ESPECÍFICOS 

Caracterizar los diferentes tipos de almacenamiento existentes en el dispositivo.



Utilizar los sistemas de almacenamiento en diversas ocasiones.

INTRODUCCIÓN Generalmente el software que se utiliza en los computadores personales necesita una cierta capa de persistencia, ya sea para guardar datos, documentos o las opciones de los usuarios. Esta capa no es exclusiva de las aplicaciones de escritorio y es posible encontrarla también en las aplicaciones móviles. El tema de esta semana es precisamente cómo almacenar datos de aplicación, de configuración y cómo compartirlos de forma correcta con otras aplicaciones.

ESTE DOCUMENTO CONTIENE LA SEMANA 6

4

1. PERSISTENCIA DE DATOS: SQLITE Android tiene incluido soporte para almacenar datos en una base de datos relacional. Para esta labor se apoya en SQLite. El SDK trae clases y métodos para interactuar con la biblioteca nativa de SQLite.

1.1. CREAR Y ABRIR LA BASE DE DATOS Una base de datos nueva en SQLite puede ser creada simplemente extendiendo la clase abstracta SQLiteOpenHelper del objeto database.sqlite e implementando los métodos onCreate y onUpgrade. El constructor para SQLiteOpenHelper espera el nombre de la base de datos y el número de su versión, además del contexto actual de la aplicación y un parámetro opcional para un cursor factory (el cursor factory es el objeto que ayuda a recorrer los resultados obtenidos por una consulta). Ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

Precaución: las operaciones en la base de datos requieren lecturas y escrituras en el “disco” y pueden tomar un tiempo más largo en ser completadas. Una aplicación no debiera invocar operaciones de base de datos desde el thread principal de la aplicación (llamado UI thread) para prevenir que la interfaz se congele y evitar diálogos de ANR (“La aplicación no está respondiendo”). En tiempo de ejecución, si la base de datos no existe, el método onCreate() se llama para que la aplicación prepare la base de datos creando las tablas necesarias. Si la base de datos existe, pero el número de la versión es menor que el provisto por el constructor, se invoca el método

ESTE DOCUMENTO CONTIENE LA SEMANA 6

5

onUpgrade() para que la aplicación realice los pasos necesarios para actualizar el esquema de la base de datos. Nota: en caso de downgrade (volver a una versión más atrás) de la base de datos, se puede implementar el método onDowngrade para modificar el esquema de la base de datos. Por defecto SQLiteOpenHelper lanza una excepción si la versión de la base de datos es mayor que la entregada por el constructor.

1.2. CREAR TABLAS Es posible crear tablas en el método onCreate incluyendo una o más instrucciones CREATE TABLE de SQL. Android solamente provee un envoltorio alrededor de SQLite; todos los comandos y tipos de datos de SQL que están soportados por SQLite pueden ser usados directamente desde Java. Ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

El ejemplo anterior crea una tabla llamada “address_book” con dos columnas: nombre e email, ambos con tipo de dato TEXT. El constraint PRIMARY KEY indica que el nombre será el identificador único para las filas de datos, de modo que no puede tener duplicados.

1.3. ACTUALIZAR LA BASE DE DATOS En tiempo de ejecución, si una base de datos existente es encontrada con un número de versión menor que el definido por la aplicación, se ejecuta el método onUpgrade() con ambos números de versión. Dependiendo de la versión existente de la base de datos, la aplicación ejecuta un conjunto de sentencias SQL para actualizar la base de datos, el esquema y los datos a la nueva versión. Se utiliza la sentencia ALTER TABLE para manipular la base de datos.

ESTE DOCUMENTO CONTIENE LA SEMANA 6

6

Ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

1.4. ESCRIBIR EN LA BASE DE DATOS Para poder escribir en la base de datos, se debe obtener un objeto de base de datos en modo escritura con el método getWritableDatabase, como en el siguiente ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

1.5. INSERTAR DATOS EN LA BASE DE DATOS Es posible insertar filas de datos en la base utilizando sentencias del tipo INSERT. Para esto la biblioteca de SQLite Android provee el método insert, que recibe como parámetros el nombre de la tabla y un objeto del tipo ContentValues que contiene los datos en formato llave-valor, como lo muestra el siguiente ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

Notar que el desarrollador no está limitado a utilizar los métodos auxiliares del SDK. También puede ejecutar sentencias más complejas utilizando el método execSQL() para manipular la base de datos, incluyendo agregar datos. Sugerencia: persistir datos desde un objeto puede llegar a ser una tarea compleja. Aunque el SDK no provee directamente esta funcionalidad, existen variadas bibliotecas de ORM (Object

ESTE DOCUMENTO CONTIENE LA SEMANA 6

7

Relational Mapping) que hacen esta tarea más (http://ormlite.com/sqlite_java_android_orm.shtml)

llevadera.

Por

ejemplo,

OrmLite

1.6. ACTUALIZAR DATOS EN LA BASE DE DATOS Los datos que ya existen en la base de datos pueden ser manipulados utilizando UPDATE. Dicho comando SQL posee un método equivalente en el SDK: update() de la clase SQLiteDatabase. Esta operación toma el nombre de la tabla, los valores y una sentencia WHERE para indicar qué filas de datos deben ser actualizadas. Sugerencia: la sentencia WHERE soporta sustitución de valores utilizando el carácter “?” para ser reemplazado por los valores reales. Este carácter es reemplazado automáticamente por valores provistos en el siguiente parámetro como un arreglo de strings.

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

En el ejemplo anterior, el valor de la columna email en la tabla “address_book” solamente se actualiza por las filas de datos con el nombre provisto en los parámetros.

1.7. LEER DESDE LA BASE DE DATOS Para leer desde la base de datos, se debe obtener una instancia de la base de datos de solo lectura. Esto se hace ejecutando el método getReadableDatabase().

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

1.8. LEER FILAS DESDE LA BASE DE DATOS El método query permite ejecutar consultas a la base de datos SQLite que retornan una o más filas de datos. Los datos se retornan dentro de una instancia de un objeto Cursor

ESTE DOCUMENTO CONTIENE LA SEMANA 6

8

(android.database.Cursor). La aplicación puede iterar a través de este cursor para extraer los datos fila por fila. Ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

El método query recibe los siguientes parámetros:        

Tabla: el nombre de la tabla. Columnas: arreglo de strings consistente en los nombres de las columnas a buscar en la tabla. Selección: este parámetro opcional corresponde al “WHERE” de la consulta. Pasar “null” retorna todas las filas. Argumentos de selección: es una lista opcional de parámetros (signos “?”) a ser sustituidos en la selección. Agrupar: corresponde al modificador group by. Puede ser null. Tiene: filtro opcional que define qué grupos de filas serán retornadas usando la cláusula “having”. Ordenar por: filtro opcional que corresponde a “order by”. Define cómo debe estar ordenado el cursor retornado. Límite: límite opcional del máximo de filas a retornar. Corresponde a “limit”.

1.9. BORRAR DATOS DE LA BASE DE DATOS Los datos de la base de datos pueden ser borrados utilizando el método delete del objeto SQLiteDatabase. El método recibe como parámetro el nombre de la tabla y una cláusula WHERE para filtrar los datos a ser borrados.

ESTE DOCUMENTO CONTIENE LA SEMANA 6

9

Ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

1.10.

BORRAR LA BASE DE DATOS

También es posible borrar la base de datos completa, llamando al método deleteDatabase del objeto Context y dando como parámetro el nombre de la base de datos. Ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

2. PERSISTENCIA DE DATOS: SHARED PREFERENCES Android tiene un framework para persistir datos de manera fácil en forma de pares llave-valor a través de la clase android.content.SharedPreferences. Para cada conjunto particular de preferencias, Android solamente almacena una única instancia de la clase para mantener la integridad de los datos. Estas preferencias se guardan en el almacenamiento interno del teléfono y se borran cuando se desinstala la aplicación.

2.1. ABRIR SHARED PREFERENCES Aunque fundamentalmente son lo mismo, el framework de Android provee dos tipos de shared preferences: las de la actividad y las genéricas.

2.1.1. ABRIR SHARED PREFERENCES DE LA ACTIVIDAD El método getPreferences de la clase Activity puede ser utilizado desde una Context de una actividad para obtener una preferencia que es privada para la actividad en ejecución, de la siguiente manera:

ESTE DOCUMENTO CONTIENE LA SEMANA 6

10

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

2.1.2. ABRIR SHARED PREFERENCES POR DEFECTO El método getDefaultSharedPreferences() del objeto PreferenceManager puede ser utilizado para obtener una instancia de shared preferences. Se recomienda valerse de las shared preferences por defecto para poder utilizar la pantalla de Opciones. Ejemplo de shared preferences genéricos:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

2.1.3. ABRIR SHARED PREFERENCES GENÉRICAS Las shared preferences genéricas pueden ser creadas usando el método getSharedPreferences del objeto Context. Otorgando un nombre de archivo, el método getSharedPreferences también solicita un modo de permisos similar al método openOutputFile de la clase Context. Ejemplo: Listing 7-13. Opening a Shared Preferences File

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

2.1.4. AGREGAR Y EDITAR SHARED PREFERENCES Nuevas entradas a shared preferences pueden ser agregadas, así como las existentes pueden ser editadas instanciando la clase SharedPreferences.Editor mediante el llamado al método edit(). La clase Editor da a los desarrolladores varios métodos para almacenar valores de preferencias en todos los tipos de datos fundamentales. Las modificaciones pueden ser almacenadas invocando al método commit(), como en el ejemplo que sigue:

ESTE DOCUMENTO CONTIENE LA SEMANA 6

11

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

2.1.5. LEER SHARED PREFERENCES Las entradas llave-valor almacenadas en shared preferences pueden ser leídas en cualquier momento utilizando los getters existentes en la clase SharedPreferences.

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

El último parámetro del getter es el valor por defecto que debiera ser retornado si no se encuentra la llave solicitada. La aplicación puede verificar si una preferencia existe a través del método contains().

2.1.6. MONITOREAR CAMBIOS EN SHARED PREFERENCES Los componentes de la aplicación también pueden ser registrados para que sean notificados al momento que hayan cambios en shared preferences. Esto se hace invocando el método registerOnSharedPreferenceChangeListener() del objeto SharedPreferences. Ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

Las aplicaciones pueden dar de baja el registro y dejar de recibir notificaciones llamando al método unregisterOnSharedPreferenceChangeListener del objeto SharedPreferences, como muestra el ejemplo:

ESTE DOCUMENTO CONTIENE LA SEMANA 6

12

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

3. PROVEEDORES DE CONTENIDOS (CONTENT PROVIDERS) Las actividades y los servicios definidos por las aplicaciones pueden ser exportados de tal manera que otras aplicaciones que están siendo ejecutadas en el mismo dispositivo pueden aprovechar sus flujos de trabajo. Si bien es cierto que tener acceso a partes de otras aplicaciones es muy útil, en algunos casos solamente se necesita acceso a los datos de la aplicación más que a sus actividades y servicios. Android provee un componente de aplicación conocido como content provider que administra el acceso a un conjunto estructurado de datos. Es una interfaz estándar que conecta los datos de una aplicación con el código en ejecución de otra aplicación. El content provider logra esto entregando encapsulamiento de datos y seguridad. Este componente y los datos que contiene son referidos a través de URI de contenidos, como por ejemplo:

content://com.apress.booksprovider/books/1.

3.1. CREAR UN CONTENT PROVIDER Un nuevo content provider puede ser creado de manera simple derivando una nueva clase de android.content.ContentProvider. La clase abstracta ContentProvider posee seis métodos también abstractos que necesitan ser implementados:      

Método de consulta: es llamado para consultar los datos del proveedor. Método de inserción: es llamado para insertar nuevo contenido al proveedor. Método de actualización: es llamado para actualizar el contenido del proveedor con nuevo contenido. Método de borrado: es llamado para borrar contenido del proveedor. getType: es llamado para obtener el MIME type del contenido que será retornado por la URI correspondiente. onCreate: es llamado por la plataforma cuando el proveedor de contenido es instanciado. Este método es llamado antes de cualquier otro.

ESTE DOCUMENTO CONTIENE LA SEMANA 6

13

A continuación, un ejemplo de implementación de content provider:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

ESTE DOCUMENTO CONTIENE LA SEMANA 6

14

3.2. CONTRATO DE UN CONTENT PROVIDER El contrato de un proveedor de contenidos define constantes que ayudan a las otras aplicaciones a trabajar con las URI de contenido, nombres de columna y otras características del proveedor. Las clases de contrato no se generan automáticamente, el desarrollador debe generarlas. Esto está definido como una buena práctica de programación. Un ejemplo del contrato es el siguiente:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

3.3. DECLARAR UN CONTENT PROVIDER Del mismo modo que las actividades y los servicios, los proveedores de contenidos no están expuestos hasta que esta propiedad haya sido declarada en el Manifest de la aplicación. Para esto se utiliza el tag XML Ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

El atributo más importante del tag es android:authorities, que define el nombre único del proveedor de contenidos. Por convención, los proveedores de contenidos debieran ser nombrados con el nombre del paquete como prefijo. Para el ejemplo anterior, “com.apress.bookprovider”. La plataforma Android guarda una referencia al proveedor de

ESTE DOCUMENTO CONTIENE LA SEMANA 6

15

contenidos de acuerdo a este authority name, el cual también es utilizado como parte de la URI para que otras aplicaciones accedan al proveedor de contenidos de la siguiente manera: content://// content://com.apress.bookprovider/book/1

3.4. SEGURIDAD DE LOS CONTENT PROVIDERS Los proveedores de contenidos pueden también declarar otros dos permisos para lectura y escritura. El permiso de lectura se especifica con el atributo “android:readPermission”; solamente aquellas aplicaciones con el permiso apropiado pueden llamar al método de consulta de este proveedor de contenido. De la misma forma, el permiso de escritura se especifica con el atributo “android:writePermission” y solamente aquellas aplicaciones con los permisos apropiados pueden llamar a los métodos insertar, actualizar y borrar. Si dos permisos separados no son necesarios, el atributo “android:permission” puede ser utilizado para especificar solo aquel permiso que accede al proveedor de contenidos. Esto es equivalente para otros componentes Android.

3.5. ACCEDER A UN PROVEEDOR DE CONTENIDOS Los proveedores de contenidos pueden ser accedidos mediante la clase android.content.ContentResolver. Una instancia de la clase ContentResolver puede ser obtenida llamando al método getContentResolver() del contexto de la aplicación (que se puede obtener con el método getApplicationContext()), como muestra el siguiente ejemplo:

Fuente: material elaborado para esta asignatura (Héctor Horta, 2015)

ESTE DOCUMENTO CONTIENE LA SEMANA 6

16

3.6. CONTENT PROVIDERS DEL SISTEMA Tal y como sucede con los servicios del sistema, la plataforma Android también provee un conjunto de content providers que habilitan el acceso a la información del usuario. A continuación se presenta la lista de los proveedores de contenido más usados de la plataforma:      

    

Alarma del reloj: provee acceso a las alarmas del usuario. También habilita la aplicación para manipular las alarmas existentes. Proveedor del browser: provee acceso al historial de navegación y marcadores del usuario. Proveedor del calendario: permite el acceso al calendario del usuario y permite que la aplicación lo manipule. Proveedor de contactos: permite el acceso a la libreta de contactos del usuario. Proveedor de registro de llamadas: permite el acceso a las llamadas recibidas y realizadas. Proveedor de documentos: provee una interfaz genérica para acceder a los documentos del usuario a través de todos los proveedores de almacenamiento como memoria y servicios en la nube. Proveedor de MediaStore: provee acceso a la metadata de todos los archivos de medios que están disponibles en el dispositivo: música, video y fotografías. Proveedor de configuración: da acceso a las preferencias globales del sistema. Proveedor de telefonía: otorga acceso a datos de telefonía como SMS y MMS y a la lista de APN (Access Point Name). Proveedor del diccionario del usuario: da acceso al diccionario definido por el usuario para métodos de entrada que serán usados en el texto predictivo. Proveedor de correo de voz: provee acceso a los mensajes de voz del usuario.

ESTE DOCUMENTO CONTIENE LA SEMANA 6

17

COMENTARIO FINAL Los contenidos de esta semana son parte fundamental del desarrollo de aplicaciones Android: el almacenamiento de datos y la disponibilidad de estos para otras aplicaciones. Es importante saber diferenciar cuando se debe utilizar SQLite o SharedPreferences. La definición general tiene que ver con el objetivo de los datos que se están almacenando y es por esto que normalmente SharedPreferences es la estrategia más utilizada para guardar datos de sesión y configuraciones de usuario, ya que solamente admite entradas del tipo llave-valor, además de que no incluye lecturas y escrituras a la memoria interna o SD del dispositivo. SQLite, por su parte, permite tener un modelo de datos complejo mediante el cual se puede almacenar mucha más información y obtener datos ajustados a las necesidades de la aplicación. Si bien es cierto puede volverse engorroso hacer consultas para operaciones muy complejas, se pueden utilizar bibliotecas de ORM que permiten disminuir la complejidad de esta tarea.

ESTE DOCUMENTO CONTIENE LA SEMANA 6

18

REFERENCIAS Cinar, O. (2015). Android Quick APIs Reference. New York: Apress.

PARA REFERENCIAR ESTE DOCUMENTO, CONSIDERE: IACC (2015). Manejo de datos en Android. Herramientas de Programación Móvil. Semana 6.

ESTE DOCUMENTO CONTIENE LA SEMANA 6

19

ESTE DOCUMENTO CONTIENE LA SEMANA 6

20