TALLER DE DESARROLLO DE
  APLICACIONES MÓVILES

      Data Storage
       Por: Felipe Hernández R.
         Twitter: @FelipeDev
Códigos
de ejemplo
Códigos fuentes
Para una mejor comprensión de este taller se han
realizado proyectos (en eclipse) de ejemplo para cada
uno de los tipos de DataStorage, exceptuando el de
tipo NetworkConnections.
En su mayoría las aplicaciones imprimen mensajes
por consola para visualizar los estados de la
aplicación.
El siguiente es el enlace a los códigos fuentes
comentados anteriormente:
https://github.com/FelipeDev/Android-Data-Storage
Se recomienda revisar los proyectos a medida que se
avanza en la presentación.
Uso de códigos fuentes
Para utilizar los proyectos del taller se debe clonar el
repositorio Git, o bien descargar los archivos
directamente desde el enlace entregado en la slide
anterior y copiar los proyectos al workspace de
Eclipse, una vez dentro de eclipse, se deben importar
los proyectos copiados en el workspace.
Tipos de
almacenamiento
Android Storage

*   Shared Preferences

*   Internal Storage

*   External Storage

*   SQLite Databases

*   Network Connections
SHARED PREFERENCES
Shared preferences

Este tipo de almacenamiento permite salvar datos
de tipo int, float, boolean, long y string. Estos datos
persistiran incluso cuando la aplicación es
finalizada.

Para obtener los datos almacenados existen dos
métodos:

   getSharedPrefereces();

   getPreferences();
getSharedPreferences()

Este método se debe utilizar cuando se deben llamar
múltiples archivos que contienen la información de las
preferencias compartidas. Cada archivo es identificado por
su nombre, el cual se debe especificar como primer
parámetro.

Ej:

SharedPreferences settings =getSharedPreferences(FILE_NAME,0);

boolean silent = settings.getBoolean("silentMode", false);

setSilent(silent);
getPreferences()

Este método se debe utilizar se necesita sólo un archivo de
preferencias para el Activity. Como éste será el único
archivo, no se debe proveer un nombre al invocarlo.

Ej:

SharedPreferences settings =getPreferences(0);

boolean silent = settings.getBoolean("silentMode", false);

setSilent(silent);
getPreferences()

Este método se debe utilizar se necesita sólo un archivo de
preferencias para el Activity. Como éste será el único
archivo, no se debe proveer un nombre al invocarlo.

Ej:

SharedPreferences settings =getPreferences(0);

boolean silent = settings.getBoolean("silentMode", false);

setSilent(silent);
Acerca de SharedPreferences
Las preferencias compartidas no son únicamente
para guardar preferencias de usuario, como por
ejemplo el ringtone que pueda haber seleccionado
el usuario. Si lo que se desea es almacenar
preferencias de usuario para una aplicación en
particular, véase PreferencesActivity, lo cual provee
un framework para crear preferencias de usuario
los cuales serán automáticamente persistidos
(usando SharedPreferences)
INTERNAL STORAGE
INTERNAL STORAGE

Es posible guardar archivos directamente en el
sistema de almacenamiento interno del dispositivo.
Por defecto los archivos guardados en el
almacenamiento interno, son privados a la
aplicación que lo crea, por tanto, las demás
aplicaciones no pueden acceder a estos archivos.
Cuando el usuario desinstala la aplicación, los
archivos son eliminados.
Creación y escritura en el
       almacenamiento interno
Para crear y escribir en archivos creados en el
almacenamiento interno, se hace de la siguiente
forma:

a) Ejecutar el método openFileOutput() con el nombre
   del archivo y el modo de operación. Esto retorna
   un FileOutputStream.

b) Escribir al archivo con write()

C) Cerrar el stream con close()
Lectura desde
        el almacenamiento interno
Para leer archivos desde el almacenamiento interno, se
hace de la siguiente manera:

a) Ejecutar el método openFileInput() con el nombre del
   archivo y el modo de operación. Esto retorna un
   FileInputStream.


b) Leer los bytes desde el archivo con read()

C) Cerrar el stream con close()
Guardar archivos en caché
Si se desea guardar datos en caché, más allá de
almacenarlos de manera persistente, se debe utilizar el
método getCacheDir() para abrir un objeto de tipo File que
representa el directorio interno donde una aplicación
puede guardar archivos de manera temporal. No se
recomienda utilizar más de 1mb de almacenamiento
temporal.

Importante: Cuando el dispositivo tiene poco espacio
de almacenamiento interno, Android puede eliminar los
archivos en caché para recuperar espacio.
Otros métodos útiles
getFilesDir(): Obtiene la ruta absoluta de un archivo en
el sistema de archivos donde los archivos internos son
almacenados.
getDir(): Crea (o abre si ya existe) un directorio dentro
del espacio del almacenamiento interno.
deleteFile(): Elimina un archivo en el almacenamiento
interno.
fileList(): Devuelve un arreglo con los archivos
guardados por la aplicación (actual) en el sistema de
almacenamiento interno
EXTERNAL STORAGE
EXTERNAL STORAGE
Todo dispositivo compatible con Android soporta
un “almacenamiento externo” compartido que
puede ser utilizado para almacenar archivos. Puede
ser un medio removible (como una tarjeta SD) o un
almacenamiento interno (no removible). Los
archivos almacenados en un almacenamiento
externo pueden ser leídos por todos e incluso
modificados por el usuario cuando éste habilita el
almacenamiento masivo USB para transferir
archivos a su computador.
Precauciones al utilizar
      almacenamiento externo
Los archivos guardados en un medio de
almacenamiento externo pueden desaparecer si el
usuario monta este medio en un computador o
simplemente lo desmonta del dispositivo, y no hay
seguridad impuesta a los archivos que se escriben
en un medio de almacenamiento externo.
Todas las aplicaciones pueden leer los datos
almacenados en este tipo de almacenamiento y
claro… los usuarios pueden eliminar estos datos.
Como usar External Storage

Antes de hacer                cualquier cosa con el
almacenamiento externo, se debe llamar al método
getExternalStorageState() para comprobar si existe algún
medio disponible.
El medio puede devolver diferentes estados
especificados                                         en:
http://developer.android.com/reference/android/os/E
nvironment.html
El uso de los diferentes estados, sirve para notificar
al usuario acerca de posibles anomalías con su
medio externo.
Crear archivos en External Storage

Si se está utilizando la api de nivel 8 (OS 2.2) o
superior, se debe utilizar el método getExternalFileDir()
para abrir un archivo que represente el directorio
donde se almacenarán los archivos. Este método
recibe como parámetro el tipo de directorio que se
desea      crear,   como       DIRECTORY_MUSIC         o
DIRECTORY_PICTURES.
Al especificar el tipo de directorio nos aseguramos que
el scanner de medios de Android categorizará
correctamente nuestros archivos y/o directorios.
Crear archivos en External Storage

Si se está utilizando la api de nivel 7 (OS 2.1) o
inferior,       se       debe     utilizar     el       método
getExternalStorageDirectory() para abrir un archivo que
represente el directorio raíz del almacenamiento
externo. Luego se debn escribir los datos en el
siguiente directorio: /Android/data/<nombre_Package>files

Donde <nombre_Package> es el nombre del paquete de
nuestra app, por ejemplo: cl.mobdev.app
Grabar archivos “caché” en External Storage


Si se está utilizando la api de nivel 8 (OS 2.2) o
superior, se debe utilizar el método getExternalCacheDir()
para abrir un archivo que represente el directorio
temporal donde almacenar los archivos en sistema
dealmacenamiento externo.

Si se está utilizando la api de nivel 7 (OS 2.1) o
inferior,       se       debe     utilizar  el   método
getExternalStorageDirectory() y seguir los mismos pasos
que en la diapositiva anterior.
Importante

Si tenemos un archivo de audio, imagen o video, el
scanner de medios de Android podría reconocer
nuestros archivos multimedia y agregarlos a las
listas que nombren este tipo de archivos.

Para evitar que los archivos agregados por nuestra
app aparezcan en las listas de otras aplicaciones,
se debe incluir un archivo vacío de nombre .nomedia
dentro del directorio de los archivos..
Network
Connections
NETWORK CONNECTIONS

Si tenemos conexión a una red local o
internet, podemos almacenar y obtener nuestros
archivos o datos mediante un servicio web.
Para utilizar este tipo de almacenamiento se debe
utilizar las clases correspondientes ubicadas en los
packages:

java.net.*;
Android.net.*;
Bases
de datos
BASES DE DATOS

Android provee total soporte para bases de datos
SQLite. Cualquier base de datos creada, será
accesible por su nombre por cualquier clase dentro
de nuestra app, pero no podrá ser accedida desde
fuera de nuestra app.

Android provee de una herramienta para la
administración de bases de datos SQLite, llamada
sqlite3 la que permite navegar entre tablas de
contenido y ejecutar comandos SQL en bases de
datos SQLite.
CREAR BASES DE DATOS

Para crear una nueva base de datos SQLite en
nuestra app, se recomienda crear una subclase de
SQLiteOpenHelper() y sobre-escribir el método onCreate(), en
el cual se puede ejecutar comandos de tipo SQL para
crear tablas en la base de datos.
Se puede obtener una instancia de nuestra propia
implementación de SQLiteOpenHelper() usando un
constructor previamente definido.
Leer y escribir registros en la DB
Para escribir registros dentro de la base de datos, se debe
utilizar el método getWritableDatabase(), para leer datos de la
base de datos se debe utilizar getReadableDatabase(). Ambos
devolverán un objeto de tipo SQLiteDatabase que representa la
base de datos y provee métodos para ejecutar operaciones
sobre ella.

Para ejecutar consultas a la base datos es posible realizarlas
mediante el método query(), el cual acepta varios parámetros de
consulta como la tabla a consultar, selección, columnas, etc.
Consultas complejas y cursores
Para consultas complejas como aquellas que requieren
dar alias a las columnas, se debe utilizar un objeto de tipo
SQLiteQueryBuilder el cual proveerá de varios métodos para
realizar consultas complejas.

En cuanto a los cursores, por cada consulta que se realice
a la DB, la consulta devolverá un Cursor que apunta a todas
las columnas afectadas por la consulta.
Más información
Más información
Todas las lecturas y ejemplos         se   basan   en   la
documentación oficial de Android.

Para mayor información visita el sitio oficial de Android:
http://developer.android.com

Data storage

  • 1.
    TALLER DE DESARROLLODE APLICACIONES MÓVILES Data Storage Por: Felipe Hernández R. Twitter: @FelipeDev
  • 2.
  • 3.
    Códigos fuentes Para unamejor comprensión de este taller se han realizado proyectos (en eclipse) de ejemplo para cada uno de los tipos de DataStorage, exceptuando el de tipo NetworkConnections. En su mayoría las aplicaciones imprimen mensajes por consola para visualizar los estados de la aplicación. El siguiente es el enlace a los códigos fuentes comentados anteriormente: https://github.com/FelipeDev/Android-Data-Storage Se recomienda revisar los proyectos a medida que se avanza en la presentación.
  • 4.
    Uso de códigosfuentes Para utilizar los proyectos del taller se debe clonar el repositorio Git, o bien descargar los archivos directamente desde el enlace entregado en la slide anterior y copiar los proyectos al workspace de Eclipse, una vez dentro de eclipse, se deben importar los proyectos copiados en el workspace.
  • 5.
  • 6.
    Android Storage * Shared Preferences * Internal Storage * External Storage * SQLite Databases * Network Connections
  • 7.
  • 8.
    Shared preferences Este tipode almacenamiento permite salvar datos de tipo int, float, boolean, long y string. Estos datos persistiran incluso cuando la aplicación es finalizada. Para obtener los datos almacenados existen dos métodos: getSharedPrefereces(); getPreferences();
  • 9.
    getSharedPreferences() Este método sedebe utilizar cuando se deben llamar múltiples archivos que contienen la información de las preferencias compartidas. Cada archivo es identificado por su nombre, el cual se debe especificar como primer parámetro. Ej: SharedPreferences settings =getSharedPreferences(FILE_NAME,0); boolean silent = settings.getBoolean("silentMode", false); setSilent(silent);
  • 10.
    getPreferences() Este método sedebe utilizar se necesita sólo un archivo de preferencias para el Activity. Como éste será el único archivo, no se debe proveer un nombre al invocarlo. Ej: SharedPreferences settings =getPreferences(0); boolean silent = settings.getBoolean("silentMode", false); setSilent(silent);
  • 11.
    getPreferences() Este método sedebe utilizar se necesita sólo un archivo de preferencias para el Activity. Como éste será el único archivo, no se debe proveer un nombre al invocarlo. Ej: SharedPreferences settings =getPreferences(0); boolean silent = settings.getBoolean("silentMode", false); setSilent(silent);
  • 12.
    Acerca de SharedPreferences Laspreferencias compartidas no son únicamente para guardar preferencias de usuario, como por ejemplo el ringtone que pueda haber seleccionado el usuario. Si lo que se desea es almacenar preferencias de usuario para una aplicación en particular, véase PreferencesActivity, lo cual provee un framework para crear preferencias de usuario los cuales serán automáticamente persistidos (usando SharedPreferences)
  • 13.
  • 14.
    INTERNAL STORAGE Es posibleguardar archivos directamente en el sistema de almacenamiento interno del dispositivo. Por defecto los archivos guardados en el almacenamiento interno, son privados a la aplicación que lo crea, por tanto, las demás aplicaciones no pueden acceder a estos archivos. Cuando el usuario desinstala la aplicación, los archivos son eliminados.
  • 15.
    Creación y escrituraen el almacenamiento interno Para crear y escribir en archivos creados en el almacenamiento interno, se hace de la siguiente forma: a) Ejecutar el método openFileOutput() con el nombre del archivo y el modo de operación. Esto retorna un FileOutputStream. b) Escribir al archivo con write() C) Cerrar el stream con close()
  • 16.
    Lectura desde el almacenamiento interno Para leer archivos desde el almacenamiento interno, se hace de la siguiente manera: a) Ejecutar el método openFileInput() con el nombre del archivo y el modo de operación. Esto retorna un FileInputStream. b) Leer los bytes desde el archivo con read() C) Cerrar el stream con close()
  • 17.
    Guardar archivos encaché Si se desea guardar datos en caché, más allá de almacenarlos de manera persistente, se debe utilizar el método getCacheDir() para abrir un objeto de tipo File que representa el directorio interno donde una aplicación puede guardar archivos de manera temporal. No se recomienda utilizar más de 1mb de almacenamiento temporal. Importante: Cuando el dispositivo tiene poco espacio de almacenamiento interno, Android puede eliminar los archivos en caché para recuperar espacio.
  • 18.
    Otros métodos útiles getFilesDir():Obtiene la ruta absoluta de un archivo en el sistema de archivos donde los archivos internos son almacenados. getDir(): Crea (o abre si ya existe) un directorio dentro del espacio del almacenamiento interno. deleteFile(): Elimina un archivo en el almacenamiento interno. fileList(): Devuelve un arreglo con los archivos guardados por la aplicación (actual) en el sistema de almacenamiento interno
  • 19.
  • 20.
    EXTERNAL STORAGE Todo dispositivocompatible con Android soporta un “almacenamiento externo” compartido que puede ser utilizado para almacenar archivos. Puede ser un medio removible (como una tarjeta SD) o un almacenamiento interno (no removible). Los archivos almacenados en un almacenamiento externo pueden ser leídos por todos e incluso modificados por el usuario cuando éste habilita el almacenamiento masivo USB para transferir archivos a su computador.
  • 21.
    Precauciones al utilizar almacenamiento externo Los archivos guardados en un medio de almacenamiento externo pueden desaparecer si el usuario monta este medio en un computador o simplemente lo desmonta del dispositivo, y no hay seguridad impuesta a los archivos que se escriben en un medio de almacenamiento externo. Todas las aplicaciones pueden leer los datos almacenados en este tipo de almacenamiento y claro… los usuarios pueden eliminar estos datos.
  • 22.
    Como usar ExternalStorage Antes de hacer cualquier cosa con el almacenamiento externo, se debe llamar al método getExternalStorageState() para comprobar si existe algún medio disponible. El medio puede devolver diferentes estados especificados en: http://developer.android.com/reference/android/os/E nvironment.html El uso de los diferentes estados, sirve para notificar al usuario acerca de posibles anomalías con su medio externo.
  • 23.
    Crear archivos enExternal Storage Si se está utilizando la api de nivel 8 (OS 2.2) o superior, se debe utilizar el método getExternalFileDir() para abrir un archivo que represente el directorio donde se almacenarán los archivos. Este método recibe como parámetro el tipo de directorio que se desea crear, como DIRECTORY_MUSIC o DIRECTORY_PICTURES. Al especificar el tipo de directorio nos aseguramos que el scanner de medios de Android categorizará correctamente nuestros archivos y/o directorios.
  • 24.
    Crear archivos enExternal Storage Si se está utilizando la api de nivel 7 (OS 2.1) o inferior, se debe utilizar el método getExternalStorageDirectory() para abrir un archivo que represente el directorio raíz del almacenamiento externo. Luego se debn escribir los datos en el siguiente directorio: /Android/data/<nombre_Package>files Donde <nombre_Package> es el nombre del paquete de nuestra app, por ejemplo: cl.mobdev.app
  • 25.
    Grabar archivos “caché”en External Storage Si se está utilizando la api de nivel 8 (OS 2.2) o superior, se debe utilizar el método getExternalCacheDir() para abrir un archivo que represente el directorio temporal donde almacenar los archivos en sistema dealmacenamiento externo. Si se está utilizando la api de nivel 7 (OS 2.1) o inferior, se debe utilizar el método getExternalStorageDirectory() y seguir los mismos pasos que en la diapositiva anterior.
  • 26.
    Importante Si tenemos unarchivo de audio, imagen o video, el scanner de medios de Android podría reconocer nuestros archivos multimedia y agregarlos a las listas que nombren este tipo de archivos. Para evitar que los archivos agregados por nuestra app aparezcan en las listas de otras aplicaciones, se debe incluir un archivo vacío de nombre .nomedia dentro del directorio de los archivos..
  • 27.
  • 28.
    NETWORK CONNECTIONS Si tenemosconexión a una red local o internet, podemos almacenar y obtener nuestros archivos o datos mediante un servicio web. Para utilizar este tipo de almacenamiento se debe utilizar las clases correspondientes ubicadas en los packages: java.net.*; Android.net.*;
  • 29.
  • 30.
    BASES DE DATOS Androidprovee total soporte para bases de datos SQLite. Cualquier base de datos creada, será accesible por su nombre por cualquier clase dentro de nuestra app, pero no podrá ser accedida desde fuera de nuestra app. Android provee de una herramienta para la administración de bases de datos SQLite, llamada sqlite3 la que permite navegar entre tablas de contenido y ejecutar comandos SQL en bases de datos SQLite.
  • 31.
    CREAR BASES DEDATOS Para crear una nueva base de datos SQLite en nuestra app, se recomienda crear una subclase de SQLiteOpenHelper() y sobre-escribir el método onCreate(), en el cual se puede ejecutar comandos de tipo SQL para crear tablas en la base de datos. Se puede obtener una instancia de nuestra propia implementación de SQLiteOpenHelper() usando un constructor previamente definido.
  • 32.
    Leer y escribirregistros en la DB Para escribir registros dentro de la base de datos, se debe utilizar el método getWritableDatabase(), para leer datos de la base de datos se debe utilizar getReadableDatabase(). Ambos devolverán un objeto de tipo SQLiteDatabase que representa la base de datos y provee métodos para ejecutar operaciones sobre ella. Para ejecutar consultas a la base datos es posible realizarlas mediante el método query(), el cual acepta varios parámetros de consulta como la tabla a consultar, selección, columnas, etc.
  • 33.
    Consultas complejas ycursores Para consultas complejas como aquellas que requieren dar alias a las columnas, se debe utilizar un objeto de tipo SQLiteQueryBuilder el cual proveerá de varios métodos para realizar consultas complejas. En cuanto a los cursores, por cada consulta que se realice a la DB, la consulta devolverá un Cursor que apunta a todas las columnas afectadas por la consulta.
  • 34.
  • 35.
    Más información Todas laslecturas y ejemplos se basan en la documentación oficial de Android. Para mayor información visita el sitio oficial de Android: http://developer.android.com