Aparte de la Base de Datos SQLite en Android existen otros medios para almacenar información de la aplicación e inclusive información de preferencias del usuario; en esta primera entrega, veremos algunas de ellas para luego adentrarnos un poco más en cada una.
Antes de hablar de los tipos de medios de persistencia que existen en Android es importante refrescar un poco el concepto como tal de persistencia en informática, nuestro campo de interés.
La persistencia en el ámbito de una aplicación indiferentemente si es una aplicación Android o de cualquier otro tipo consiste en que los datos manipulados por la aplicación "sobrevivan" a la ejecución de la misma en el tiempo; en otras palabras; consiste en almacenar los datos en un medio secundario, no volátil para posterior reconstrucción y utilización; por lo tanto son independientes en el tiempo del proceso que los creó.
Coloquialmente hablando... consiste en que los datos no se borren luego de que la aplicación se cierre.
La Persistencia en Android
La persistencia en Android consiste en tres tipos de almacenamientos con un propósito muy específico.
1. Persistencia en Android: Preferencias Compartidas o Shared Preferences
Con Shared Preferences podemos almacenar y recuperar en el formato clave-valor información como texto, booleanos y números; lo que lo convierte en potencial para almacenar configuraciones del usuario como: estilos, preferencias, etc.
1.1 Shared Preferences en la práctica
los modos de acceso posibles son:
- MODE_PRIVATE: Sólo nuestra aplicación tiene acceso a estas preferencias.
- MODE_WORLD_READABLE: Todas las aplicaciones pueden leer estas preferencias, pero sólo la nuestra puede modificarlas (deprecated desde el API 17).
- MODE_WORLD_WRITEABLE: Todas las aplicaciones pueden leer y modificar estas preferencias (deprecated desde el API 17).
Su uso es sencillo; si queremos recuperar una "preferencia" que hemos llamado "MiPreferencia" basta con emplear el siguiente código:
SharedPreferences preferencia = getSharedPreferences("MiPreferencia",Context.MODE_PRIVATE);
Para obtener la información de la preferencia:
SharedPreferences preferencia =
boolean = preferencia.getBoolean("habilitar_imagenes", true);
Los parámetros consisten en:
- El nombre de la preferencia que queremos recuperar.
- Valor por defecto que será utilizado si la preferencia no existe en el sistema.
Para guardar o modificar información de la preferencia:
SharedPreferences preferencia = boolean = preferencia.putBoolean("habilitar_imagenes", false);
2. Persistencia en Android: Almacenar archivos en memoria
Este tipo de persistencia es uno de los más conocidos debido a que son soportados por la mayoría de los lenguajes de programación aparte de Java; consiste en guardar y recuperar la información en archivos; Android permite escribir y leer archivos que se encuentren ubicados en la propia Memoria Interna del dispositivo; al igual que con Shared Preferences.
2.1 Almacenar archivos en Memoria Interna
Hay que tener en cuenta que estos archivos son guardados en la Memoria Interna del dispositivo la cual puede ser limitada en el dispositivo y puede ralentizar el mismo.
Consideraciones
No es necesario pedir permisos especiales en el Manifest.
Sobre su uso: Apertura y Escritura de archivos en Android
Android proporciona el método OutputStreamWriter
para escribir archivos en Android a través de la apertura del mismo con el método openFileOutput
; el mismo recibe como parámetro:
- El nombre del archivo.
- El modo de acceso:
Es posible configurar los archivos para que solo puedan ser gestionados por la aplicación y por nadie ni nada más; ni siquiera el usuario; los modos de acceso son los siguientes:
- MODE_PRIVATE: Solo es asesible por la aplicación y por nadie ni nada más (crea el archivo o lo sobrescribe si ya existe).
- MODE_APPEND: Añade contenido a un archivo existente en el dispositivo.
- MODE_WORLD_READABLE: Permite que otras aplicaciones puedan leer el archivo (deprecated desde el API 17).
- MODE_WORLD_WRITEABLE: Permite que otras aplicaciones puedan escribir el archivo (deprecated desde el API 17).
Ejemplo de escritura de un archivo en Android
try
{
OutputStreamWriter outputStreamWriter=
new OutputStreamWriter(
openFileOutput("prueba.txt", Context.MODE_PRIVATE));
outputStreamWriter.write("Hola Mundo");
outputStreamWriter.close();
}
catch (Exception e)
{
e.printStackTrace();
}
Sobre su uso: Lectura de archivos en Android
Al igual que en Java, utilizamos el método BufferedReader
para leer los archivos en Android con previa apertura del mismo con el método openFileInput
; luego podemos utilizar los métodos comunes en java.io para leer el contenido.
Ejemplo de lectura de un archivo en Android
try
{
BufferedReader fin =
new BufferedReader(
new InputStreamReader(
openFileInput("prueba.txt")));
String texto = fin.readLine();
Log.i("ddd",texto);
fin.close();
}
catch (Exception e)
{
e.printStackTrace();
}
2.2 Almacenar archivos en Memoria Externa
Podemos guardar nuestros archivos en la Memoria Externa (en la mayoría de los casos, la memoria SD) con los permisos solicitados en el Manifest; hay que tener en cuenta que los archivos se encuentran accesibles para todos: aplicaciones y usuario; por lo tanto no es recomendable utilizarlos para almacenar información sensible.
Para leer y escribir respectivamente en Memoria Externa (SD) es necesario pedir los siguientes permisos especiales en el Manifest:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Sobre su uso: Estatus de la Memoria Externa en Android
Antes de realizar cualquier operación sobre la Memoria Externa es necesario saber el status de la misma mediante la funcion Environment.getExternalStorageStatus()
:
- Environment.MEDIA_MOUNTED: Indica que la memoria esta disponible y "montada" en el dispositivo; por lo tanto podemos acceder a la misma.
- Environment.MEDIA_MOUNTED_READ_ONLY: Indica que la memoria esta disponible y "montada" en el dispositivo; pero sólo podemos leer en ella.
- Environment.MEDIA_UNMOUNTED, Environment.MEDIA_REMOVED... Los demas estatus indican que la memoria no esta disponible y que por lo tanto no podemos ni leer ni escribir en la misma.
Para leer o escribir en Memoria Externa es necesario primero obtener la ruta hacia la Memoria Externa; la podemos obtener llamando a la función Environment.getExternalStorageDirectory()
.
Sobre su uso: Escritura de archivos en Android
Ahora podemos abrir el archivo creando un objeto File
provisto por java.io pasando el objeto de tipo File
como parámetro a la función FileOutputStream
que a su vez se lo pasamos como parámetro a la función OutputStreamWriter
que permite abrir el archivo en modo de escritura:
try
{
File ruta = Environment.getExternalStorageDirectory();
File file = new File(ruta.getAbsolutePath(), "prueba.txt");
OutputStreamWriter outputStreamWriter =
new OutputStreamWriter(
new FileOutputStream(file));
outputStreamWriter.write("Hola Mundo.");
outputStreamWriter.close();
}
catch (Exception e)
{
e.printStackTrace();
}
Sobre su uso: Lectura de archivos en Android
Para leer un archivo, luego de creado el objeto de tipo File
enclausulamos el mismo dentro de un objeto que permita la lectura el mismo como BufferedReader
; de aquí podemos leer el mismo como cualquier función provista por Java.io:
try
{
File ruta = Environment.getExternalStorageDirectory();
File file = new File(ruta.getAbsolutePath(), "prueba.txt");
BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(
new FileInputStream(file)));
String texto = bufferedReader.readLine();
bufferedReader.close();
}
catch (Exception e)
{
e.printStackTrace();
}
3. Persistencia en Android: Base de Datos SQLite
Este tipo de persistencia es bastante conocidos por los desarrolladores no solo de aplicaciones para Android, si no también en otros lenguajes como lo son PHP, Java (Web o de escritorio) C#, etc; este sistema gestor de base de datos es desconocidas para algunos; pero son ampliamente utilizados en aplicaciones tan conocidas como:
- BlackBerry.
- Windows Phone 8.
- IOS.
- Google Chrome.
- Mozilla Firefox.
- Y por supuesto, en Android.
SQLite es un sistema gestor de bases de datos relacional contenida en una relativamente pequeña biblioteca escrita en C. A diferencia de los sistemas de gestión de bases de datos cliente-servidor, el motor de SQLite no es un proceso independiente con el que el programa principal se comunica. En lugar de eso, la biblioteca SQLite se enlaza con el programa pasando a ser parte integral del mismo.
Algunas características interesantes de SQLite
- El conjunto de la base de datos (definiciones, tablas, índices, y los propios datos), son guardados como un sólo fichero estándar en la máquina host.
- SQLite usa un sistema de tipos inusual. En lugar de asignar un tipo a una columna como en la mayor parte de los sistemas de bases de datos SQL, los tipos se asignan a los valores individuales. Por ejemplo, se puede insertar una cadena de texto en una columna de tipo entero (a pesar de que SQLite tratará en primera instancia de convertir la cadena en un entero).
Conclusiones
Este artículo representa una entrada a este mundo de la Persistencia en Android; presentamos alguna de sus características y posibles usos; en posteriores artículos nos adentramos en cada uno de ellos con especial interés en SQLite.
Enlaces de Interés
- Preferencias en Android: Shared Preferences
- Ficheros en Android (I): Memoria Interna
- Ficheros en Android (II): Memoria Externa (Tarjeta SD)
Develop with Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter