Usuario:ManuelRomero/Android/persistencia/Teoria
Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos. Ver página de charlas. |
Tipos de almacenamiento externo
- En Android cuando ejecutamos una aplicación, se crea o levanta una máquina virtual para su ejecución.
- Cuando se acaba o finaliza la ejecución desaparece dicha máquina virtual
- En general tengo diferentes sitios para ubicar ficheros (res, targeta SD, asset).
- Vamos a ver difernetes formas de usar tanto para leer como para escribir datos que se puedan mantener después de la ejecución de la app
- En Android tenemos las siguientes maneras de almacennar datos
- Bases de datos SQLLite
- Ficheros de preferencias compartidas
- Ficheros en memoria externa o sd
- Ficheros como recursos del sistema
- ficheros en la carpeta /asset
- ficheros en la carpeta /res/raw
Almacenamiento interno
- Desaparecerán del sistema cuando se desinstale la aplicación
recursos directos o no compilados
- Este tipo de almacenamiento interno hace que los ficheros se compilan con la app, es decir que se instalarán junto con la aplicación.
- En un proyecto android existe una carpeta llamada /assets que en principio está vacía. Su objetivo es almacenar ficheros externos a la aplicación que serán distribuidos junto con nuestro .apk (formará parte de la compilacón).
- Igualmente podremos colocar los fichero sen la carpeta /res/raw, en este caso tendremos una serie de restricciones
El nombre del fichero debe ser restrictivamente sencillo como el de cualquier recurso que cuelgue de la carpeta /res
letras minusculas, números y el carácter de subrayado identificadores de nombre de recursos:[a..z1..9_]*
- Este tipo de fichero es de solo lectura, no se puede escribir en ellos.
/assets Vs /res
- Existen muchas situaciones en las que las dos ubicaciones pueden satisfacer nuestras necesidades
- Sin embargo existen difernecias
- En /res/raw solo podemos poner ficheros y no hacer ninguna estructura de directorio, mientras que en /assets sí que se puede hacer
- Para abrir un fichero en assets necesitamos tener un objeto AssetManager, mientras que no necesitamos ningún agente para /res/raw. Supongamos un recurso llamado datos.txt
1.- en /assets <sourece lang=java> .... AssetManager asset = getAssets(); InputStream = asset.open("datos.txt"); .... </source>
2.- en /res/raw
InputStream fa = getResources().openRawResource(R.raw.datos);
Los ficheros ubicado en /assets se pueden recuperar y navegar por esa carpeta (directorios, ficheros) como si fuera un sistema de ficheros normal de un SO.
Los ficheros que ubiquemos en /res son accesibles como un recurso identificado en la clase R (clase generado de forma autmática para darme una referencia a cada recurso de mi aplicación). Los ficheros colocados en el directorio /asset podrán ser accedidos como si fuera en un sistema de ficheros, sin ningún tipo de restricción Útil por ejemplo para guardar datos de un juego, o la configuración de una aplicación, …)
Otra opción para guardar información es usar una base de datos, por ejemplo SQLLite, sobre todo indicado cuando la información esté estruturada (pensemos en una tabla de base de datos).
Para gestionar los recursos ubicado en la carpeta /asset procederemos
- Físicamente ubicamos los ficheros en la carpeta
- En el código necesitamos un objeto que permita gestionar este recurso (objeto de la clase AssetManager)
- Estos recursos no generan un ID en la clase R, por lo que debemos especificar el nombre y la ruta para acceder a ellos (usando la clase AssetManager, como ya hemos indicado).
- Conclusion
Nosotros podemos almacenar ficheros en recursos y también en asset permite establecer jerarquía de ficheros, cosas que res no permite, en esta línea los ficheros ubicados en la carpeta res son más restrictivos y su acceso es menos libre (hay que acceder a través del Id que se general en la clase R).