Sei sulla pagina 1di 13

OBJETIVO

El objetivo de este resumen es conocer las diferentes formas de almacenar


los datos en el sistema operativo Android.

DESARROLLO
Android ofrece diferentes opciones para guardar los datos de una aplicación
de acuerdo con las necesidades que se ofrezcan.
Existen diferentes opciones de almacenamiento de datos disponibles en
Android:
 Almacenamiento interno
 Almacenamiento externo
 Preferencias compartidas
 Base de datos
Almacenamiento Interno
Sirve para almacenar archivos privados de aplicaciones en el sistema del
dispositivo.
De forma predeterminada, los archivos que se guardan en el almacenamiento
interno son privados para la aplicación, por lo que otras aplicaciones no pueden
tener acceso a ellos.
El sistema proporciona un directorio privado en el sistema de archivos para
cada aplicación. En ese directorio, se organiza cualquier archivo que necesite la
aplicación.
Cuando el usuario desinstala la aplicación, se quitan los archivos guardados
en el almacenamiento interno, debido a esto no se debe utilizar el almacenamiento
interno para guardar ningún contenido que el usuario espere que persista
independientemente de la aplicación.
Para ello se debe utilizar la API de MediaStore para guardar todos los tipos
de archivos mencionados anteriormente en la colección de contenido multimedia
correspondiente.
Archivos en la caché interna
Para almacenar datos temporalmente, en lugar de almacenarlos de forma
permanente, se utiliza el directorio especial de caché para guardarlos.
Cada aplicación tiene un directorio de caché privado específico para este tipo
de archivos por lo que cuando el dispositivo tenga poco espacio de almacenamiento
interno, Android podrá quitar esos archivos de caché para recuperar espacio.
La aplicación no requiere ningún permiso del sistema para leer y escribir en
los directorios internos devueltos por los métodos.
Consultar espacio libre
Para averiguar si hay suficiente espacio disponible sin causar una
IOException se llaman a los métodos getFreeSpace() o getTotalSpace(). Estos
métodos proporcionan el espacio disponible actual y el espacio total en el volumen
de almacenamiento, respectivamente.
El sistema no garantiza que se puedan escribir tantos bytes como se indican
mediante getFreeSpace().
Escribir un archivo
Al guardar un archivo en el almacenamiento interno, puede adquirir el
directorio apropiado como un File llamando a uno de los siguientes métodos:
 getFilesDir(): Devuelve una File representación de un directorio interno
para la aplicación.
 getCacheDir(): Devuelve una File representación de un directorio
interno para los archivos de caché temporales de la aplicación.
Para crear un nuevo archivo en uno de los directorios anteriores se hace uso
del constructor del File(), especificando el directorio de almacenamiento interno y el
nombre del archivo.
Código
File file = new File(context.getFilesDir(), filename);
Para una solución más rápida se usa la librería Jetpack security, que se
muestra a continuación:
Como alternativa se llama al método openFileOutput() para obtener
FileOutputStreamun que escriba en un archivo en su directorio interno.

El openFileOutput()método requiere un parámetro de modo de archivo.


 MODE_PRIVATE.
 MODE_WORLD_READABLE y MODE_WORLD_WRITEABLE, han
sido en desuso desde el nivel API 17.
Escribir un archivo en caché
Para almacenar los archivos en cache se usa el createTempFile(). Por
ejemplo:
Almacenamiento Externo
Android admite un espacio de "almacenamiento externo" compartido que se
puede utilizar para guardar archivos como una computadora o tarjeta SD, así que
cualquier usuario puede leer los archivos guardados en el almacenamiento externo
por lo que puede modificarlos, cuando se habilita el almacenamiento masivo de USB
para transferir archivos a una computadora.
Usualmente el almacenamiento externo se utiliza para para conservar los
datos del usuario a los que deben acceder otras aplicaciones, como las fotos
tomadas o los archivos descargados, incluso si el usuario desinstala la aplicación.
El sistema proporciona directorios públicos estándar para este tipo de
archivos, por lo que el usuario tiene una ubicación para sus fotos, sus tonos de
llamada, su música, etc.
Permisos de almacenamiento externo
Android incluye los siguientes permisos para acceder a archivos en
almacenamiento externo:
READ_EXTERNAL_STORAGE: Permite que una aplicación acceda a
archivos dentro de un dispositivo de almacenamiento externo.
WRITE_EXTERNAL_STORAGE: Permite que una aplicación escriba y
modifique archivos dentro de un dispositivo de almacenamiento externo. Las
aplicaciones que tienen este permiso también reciben el
READ_EXTERNAL_STORAGE permiso automáticamente.
A partir de Android 4.4 (nivel de API 19), leer o escribir archivos en el
directorio específico de la aplicación no requiere ningún permiso relacionado con el
almacenamiento.
Si la aplicación es versión Android 4.3 (API nivel 18) o inferiores y para
acceder a un directorio específico de la aplicación, debe declarar que el permiso se
solicitará solo en versiones inferiores de Android agregando el maxSdkVersion
atributo:

Verificar el almacenamiento externo


Debido a que el almacenamiento externo puede no estar disponible, siempre
se debe verificar que el volumen esté disponible antes de acceder a él.
Para consultar el estado del almacenamiento externo se llama al metodo
getExternalStorageState(), el cual devuelve uno de los siguientes estados:
 MEDIA_MOUNTED: puede leer y escribir sus archivos.
 MEDIA_MOUNTED_READ_ONLY: solo puede leer los archivos.
Por ejemplo, los siguientes métodos son útiles para determinar la
disponibilidad de almacenamiento:

Guardar un Archivo en un Directorio


Publico
Para guardar archivos en el almacenamiento externo y poder que otras
aplicaciones accedan a ella, se usan las siguientes API:
MediaStoreAPI: guardar una foto, un archivo de audio o un videoclip.
ACTION_CREATE_DOCUMENT: guardar cualquier otro archivo, como un
documento PDF.
Para ocultar los archivos del Media Scanner, se debe incluir un archivo vacío
nombrado .nomediaen en el directorio específico de la aplicación
Privado
Para guardar archivos privados se adquiere un directorio específico de la
aplicación llamando al getExternalFilesDir() y pasándole un nombre que indique el
tipo de directorio.
Cada directorio creado de esta manera se agrega a un directorio principal
que encapsula todos los archivos de almacenamiento externo de la aplicación, que
el sistema limpia cuando el usuario desinstala su aplicación.
Fragmento de código muestra cómo puede crear un directorio para un álbum
de fotos individual:

Es importante utilizar nombres de directorio proporcionados por constantes


API. Estos nombres de directorio aseguran que los archivos sean tratados
adecuadamente por el sistema.
Si ninguno de los nombres de subdirectorio predefinidos se ajusta a los
archivos, se puede llamar al getExternalFilesDir()y pasar null. Esto devuelve el
directorio raíz para el directorio privado de su aplicación en el almacenamiento
externo.
Preferencias compartidas
Si la aplicación no necesita almacenar muchos datos ni requiere una
estructura, se recomienda utilizar SharedPreferences.
La API de SharedPreferences permite leer y escribir pares clave-valor
persistentes de tipos de datos de primitivas: booleanos, floats, ints, longs y strings.
Los pares clave-valor se escriben en archivos XML que persisten en todas
las sesiones de usuario, incluso si finaliza el proceso de la aplicación. Se puede
especificar manualmente un nombre para el archivo o utilizar ficheros por actividad
para guardar los datos.
Para crear un nuevo archivo de preferencias compartidas o acceder a uno
existente se llama a uno de los siguientes métodos:
 getSharedPreferences(): múltiples archivos de preferencias
compartidas identificados por nombre, que especifique con el primer
parámetro.
 getPreferences(): solo un archivo de preferencias compartido para la
actividad. Debido a que esto recupera un archivo de preferencias
compartidas predeterminado que pertenece a la actividad, no necesita
proporcionar un nombre.
El siguiente código accede al archivo de preferencias compartidas
identificado por la cadena de recursos R.string.preference_file_keyy lo abre usando
el modo privado para que solo la aplicación pueda acceder al archivo:

Escribir en preferencias compartidas


Para escribir en un archivo de preferencias compartido, se crea un
SharedPreferences.Editor llamando edit() a su SharedPreferences.
La las claves y los valores se pasan con métodos como putInt()y putString()
y luego se llama a apply()o commit() para guardar los cambios. Por ejemplo:

Base de datos
Android proporciona compatibilidad completa con bases de datos de SQLite.
En lugar de usar las API de SQLite directamente, se puede crear una base de datos
e interactuar con ella mediante la persistencia de biblioteca de Room.
La biblioteca de Room proporciona una capa de abstracción de mapeo de
objetos que permite un acceso fluido a la base de datos mientras se aprovecha toda
la potencia de SQLite.
las API de SQLite son de nivel bastante bajo y requieren mucho tiempo y
esfuerzo para su uso. Por ejemplo:
 No hay verificación en tiempo de compilación de las consultas SQL sin
procesar.
 A medida que cambia el esquema, se necesita actualizar
manualmente las consultas SQL afectadas. Este proceso puede llevar
mucho tiempo y ser propenso a errores.
 Se necesita escribir mucho código predeterminado para realizar
conversiones entre consultas SQL y objetos de datos Java.
Las API que necesitará para usar una base de datos en Android están
disponibles en el android.database.sqlitepaquete.
La biblioteca de persistencias de Room se encarga de esas cuestiones al
mismo tiempo que proporciona una capa de abstracción sobre SQLite.
Definir un esquema y contrato
El esquema se refleja en las declaraciones SQL que utiliza para crear la base
de datos. Puede resultar útil crear una clase complementaria, conocida como clase
de contrato, que especifique explícitamente el diseño de su esquema de forma
sistemática y autodocumentada.
Una clase de contrato es un contenedor de constantes que definen nombres
para URI, tablas y columnas. Permite usar las mismas constantes en todas las otras
clases en el mismo paquete. Esto le permite cambiar el nombre de una columna en
un lugar y hacer que se propague por todo el código.
Por ejemplo, el siguiente contrato define el nombre de la tabla y los nombres
de columna para una sola tabla que representa una fuente RSS:

Crear una base de datos con un ayudante de SQL


Una vez definida la estructura de la base de datos, se debe implementar
métodos que creen y mantengan la base de datos y las tablas. Aquí hay algunas
declaraciones típicas que crean y eliminan una tabla:

Android almacena la base de datos en la carpeta privada de la aplicación.


Los datos son seguros, porque de forma predeterminada esta área no es accesible
para otras aplicaciones o el usuario.
La SQLiteOpenHelperclase contiene un conjunto útil de API para administrar
la base de datos, ya que el sistema realiza las operaciones potencialmente de larga
duración de crear y actualizar la base de datos solo cuando sea necesario y no
durante el inicio de la aplicación. Para ello se llaman a los siguientes métodos:
 getWritableDatabase()
 getReadableDatabase().
Para utilizar SQLiteOpenHelper, crear una subclase que anula las onCreate()
y onUpgrade().
Por ejemplo, aquí hay una implementación SQLiteOpenHelperque usa
algunos de los comandos que se muestran arriba:

Insertar información en una base de datos


Inserte datos en la base de datos pasando un objeto ContentValues al
método insert():
Leer información de una base de datos
Para leer desde una base de datos, se debe usar el método query(),
pasándole los criterios de selección y las columnas deseadas. El método combina
elementos de insert() y update(), excepto que la lista de columnas define los datos
que desea obtener.

Eliminar información de una base de datos


Para eliminar filas de una tabla, debe proporcionar criterios de selección que
identifiquen las filas del método delete(). El mecanismo funciona igual que los
argumentos de selección del método query().
Actualizar una base de datos
Cuando necesite modificar un subconjunto de los valores de la base de datos,
se usa el método update()
La actualización de la tabla combina la sintaxis ContentValues de insert() con
la sintaxis WHERE.
REFERENCIAS
[1]"Data and file storage overview | Android Developers", Android
Developers, 2019. [Online]. Available:
https://developer.android.com/guide/topics/data/data-storage. [Accessed: 20- Oct-
2019].
[2]"Save a file on internal storage | Android Developers", Android
Developers, 2019. [Online]. Available: https://developer.android.com/training/data-
storage/files/internal?hl=es-419#java. [Accessed: 20- Oct- 2019].
[3]"Save a file on external storage | Android Developers", Android
Developers, 2019. [Online]. Available: https://developer.android.com/training/data-
storage/files/external?hl=es-419#java. [Accessed: 20- Oct- 2019].
[4]"Save key-value data | Android Developers", Android Developers, 2019.
[Online]. Available: https://developer.android.com/training/data-storage/shared-
preferences.html. [Accessed: 20- Oct- 2019].
[5]"Save data using SQLite | Android Developers", Android Developers,
2019. [Online]. Available: https://developer.android.com/training/data-
storage/sqlite.html. [Accessed: 20- Oct- 2019].

https://code.tutsplus.com/es/tutorials/android-from-scratch-how-to-store-application-
data-locally--cms-26853

Potrebbero piacerti anche