Vous êtes sur la page 1sur 27

Almacenando Datos Locales

Desarrollo Mvil con Android


Por: Jos Daz Daz CEO JOEDAYZ @joedayz

Introduccin
Muchos programas reales necesitan persistir estados, por ejemplo: tamao del font, una foto del ultimo viaje que hemos hecho, o el plan de la siguiente semana. Android nos permite almacenar informacin en nuestro mvil para usarlo despus y protegerlo de ser accesado accidentalmente o maliciosamente por otros programas.

Introduccin
Nuestra aplicacin puede almacenar datos usando diferentes tcnicas dependiendo del tamao de los datos, su estructura, su ciclo de vida, y si ser compartido con otros programas.

Aadiendo opciones a Sudoku


En temas anteriores cuando el usuario presionaba el Men Key y seleccionaba Settings el cdigo inicia el activity Prefs que permite al usuario cambiar las opciones del juego. Prefs extiende de PreferenceActivity, los valores para el settings son almacenados en el rea de preferencias del programa, pero, en estos momentos no sucede eso. Vamos a implementar ello.

Cambios en la clase Prefs


Debe coincidir con res/xml/settings.xml

Cambios en Music.play()

Cambios en PuzzleView.onDraw()
Si retorna true, tenemos que dibujar los highlights para los hints.

Continuando un antiguo juego

Continuando un antiguo juego


Un jugador en cualquier momento puede decidir detener el juego o hacer otra cosa como atender una llamada. La idea es que el jugador pueda salvar el estado actual del tablero. El API Preferences puede ser usado para ms que slo opciones, tambin este puede almacenar bits de informacin stand-alone que van con nuestro programa.

Modificando Game.java
Aadiremos dos constantes: una para guardar el key del tablero y otro como flag para saber si queremos continuar un juego anterior o iniciar uno nuevo.

Modificando Game.java
Tambin necesitamos guardar el actual tablero donde el juego haya sido pausado.

Modificando Game.java
Cmo recuperamos la informacin? Recordemos que cuando el juego es iniciado, el getPuzzle() es invocado, y el nivel de dificultad es pasado.

Si esta establecido. En lugar de iniciar con un tablero de cero, continuamos con uno previamente guardado.

Modificando Sudoku.java
Habilitamos el botn Continue en la pantalla principal para que haga algo.
startGame() pasa el nivel de dificultad al activity Game, y el Game.onCreate() llama a Intent.getIntExtra() para leer la dificultad y pasar esto al getPuzzle().

Modificando Game.java
Hay una ltima cosa que hacer: restaurar nuestro juego previamente grabado cuando nuestro activity dejo de operar y retorna nuevamente. Esta modificacin se realiza en el Game.onCreate():

Recuerda la posicin actual


Si tu cambias la orientacin de la pantalla mientras Sudoku se esta ejecutando observaremos que este olvida la posicin del cursor. Esto es porque usamos una vista personalizada para PuzzleView. Android normalmente salva el estado de una vista automticamente, pero, desde que usamos el nuestro, no obtenemos eso gratis. Tenemos que persistir el estado de la instancia porque no es permanente. Este vive en la clase Bundle en la pila de aplicaciones de Android.

Modificando PuzzleView.java
Aadimos constantes para guardar y restaurar la posicin del cursor. Ms cualquier estado que necesitemos en la clase View.

Modificando PuzzleView.java
Como parte del procesamiento de Activity.onSaveInstanceState(), Android invoca a View.onSaveInstanceState() en cada View que posee un ID. Lo mismo sucede para onRestoreInstanceState(). Normalmente este ID viene desde el XML, pero, como la vista la hemos creado por cdigo, le establecemos un nmero arbitrario.

Modificando PuzzleView.java
El mtodo onSaveInstanceState() llama a la superclase para obtener su estado, y luego salva el estado suyo en su Bundle. El mtodo onRestoreInstanceState() recupera la informacin salvada. Obtiene nuestra posicin x e y desde el Bundle, y luego llama a la superclase. Despus de estos cambios el cursor ser recordado por PuzzleView como si fuera otra vista de Android.

Accesando al sistema de archivos interno


Android ejecuta Linux, eso lo sabemos. As que hay un sistema de archivos montado ah con un directorio root y todo. Los archivos son guardados en una memoria no voltil construida en el dispositivo, de manera que los datos no se pierden cuando el telfono es apagado. Todas nuestras rutinas java file I/O del paquete java.io estn disponibles para usarlos en nuestro programa.

Accesando al sistema de archivos interno


Tu proceso tiene permisos limitados. No puede acceder a datos de otra aplicacin. Lo nico a lo que puede acceder es a un paquete privado creado en tiempo de instalacin (/data/data/packagename). Unos cuantos metodos Helper son provistos por la clase Context para permitirte leer y escribir data ah.

Accesando al sistema de archivos interno


Los que ms necesitas son: deleteFile() : elimina un archivo privado fileList(): retorna la list de todos los archivos en el directorio como un array de String openFileInput(): abre el archivo privado para lectura. Retorna un java.io.FileInputStream openFileOutput() : abre el archivo para escritura. Retorna un java.io.FileOutputStream

Accesando al sistema de archivos interno


Sin embargo desde que la memoria interna es limitada, se recomienda mantener el tamao de la data reducido, digamos un MB o 2MB, y ser cuidadoso de manejar errores de I/O cuando escribimos por si nos quedamos espacio. Afortunadamente la memoria interna no es la nica posibilidad de almacenar datos que necesitamos.

Accesando a SD Cards
Algunos dispositivos de Android incluyen un slot para memoria adicional, tpicamente, Secure Digital (SD) card. Los tenemos de muchos tamaos para poder almacenar msica y video. Ellos no pueden ser usados por cdigo, y cada aplicacin puede leer y escribir archivos ah. Recuerda en un ejemplo anterior pusimos un vdeo en /data del emulador. Este es el lugar equivocado de hacerlo, puesto, que no es adecuado colocar archivos grandes en el sistema de archivos.

Accesando a SD Cards
La mejor forma es crear y formatear un virtual SD Card que podemos aadir al emulador. Afortunadamente ya lo tenemos. Cuando creamos el emulador le dijimos que tenamos un SD card de 64MB. Copiemos el ejemplo del video al SD Card:

Accesando a SD Cards

Accesando a SD Cards
Luego necesitamos modificar el mtodo onCreate() de la clase Video para ejecutar la pelicula desde el SD Card en lugar del directorio /data //Load and start the movie video.setVideoPath(/sdcard/samplevideo.3gp); Video.start();

Contacto
Jr. Huamachuco 1408, Oficina 401, Jess Mara Lima Per (511) 987500273 www.joedayz.pe

Vous aimerez peut-être aussi