[WP7] Almacenamiento de archivos en local

Como todos sabréis a estas alturas el almacenamiento de archivos en local dentro los dispositivos con Windows Phone 7 ha cambiado bastante respecto de sus predecesores.

Microsoft está apostando fuerte por los servicios en la nube y este es un claro ejemplo en el que se nos invita a los desarrolladores a almacenar los datos de nuestra aplicación en un servicio a través de Internet.

Sin embargo almacenar datos de configuración, preferencias del usuario o datos como caché en la nube puede ser más incómodo que almacenarlos en local. Para lograr esto podemos utilizar el almacenamiento aislado o Isolated Storage.

El Isolated Storage es un lugar de almacenamiento aislado del sistema y del resto de las aplicaciones. Tiene como ventaja fundamental que a estos espacios aislados no se puede acceder desde otras aplicaciones lo cual aporta más seguridad a las aplicaciones.

Vamos a ver un par de métodos para almacenar datos como la configuración de un programa que haga el usuario o los datos que se quieran cachear para que estén disponibles de manera más rápida.

La primera es guardando los datos en app.config de la aplicación y la segunda guardando un archivo como tal dentro del espacio reservado para la aplicación móvil.

 

 

Usando el App.Config

Bueno como siempre lo primero de todo será crear un nuevo proyecto, usaremos Silverlight para construir la aplicación de Windows Phone 7.

La interfaz simplemente va a contener un textbox con el que vamos a introducir valores, el botón para dar la orden y un listbox donde iremos mostrando los datos almacenados.

 

image
Vamos a crear algunos métodos para facilitarnos el proceso de lectura y escritura, por un lado necesitamos poder almacenar el valor junto con la clave que lo identifica.

 

        private void EstablecerValor(string clave, string valor)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
IsolatedStorageSettings.ApplicationSettings[clave] = valor;
else
IsolatedStorageSettings.ApplicationSettings.Add(clave, valor);

IsolatedStorageSettings.ApplicationSettings.Save();
}

 

Bueno, lo que hace este método es comprobar si la clave ya está contenida en el AppSettings, si lo está actualiza el valor y si no lo guarda como nuevo. 
Ahora necesitamos leer el valor introducido, para esto pasamos la clave al método ObtenerValor y en el caso de existir nos es devuelto.


        private string ObtenerValor(string clave)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
return IsolatedStorageSettings.ApplicationSettings[clave].ToString();
else
return default(string);
}
 

Ya solo necesitamos algunas funciones para conocer la cantidad de datos que tenemos guardados, rellenar la lista y actualizar el contador que


vamos a utilizar.


 

        private int CantidadClaves()
{
return IsolatedStorageSettings.ApplicationSettings.Count;
}

private void RellenarLista()
{
listBox1.Items.Clear();

for (int i = 0; i < CantidadClaves(); i++)
{
listBox1.Items.Add(ObtenerValor(i.ToString()));
}

ActualizarContador();
}


private void ActualizarContador()
{
contador = CantidadClaves();
}
 

Ahora en el evento Click del botón hacemos una llamada a EstablecerValor y luego relleno el listbox.


 

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
{
EstablecerValor(contador.ToString(), txtEntrada.Text);
RellenarLista();
}
 

Los valores guardados permanecerán en el teléfono mientras este no se resetee.
El código completo es este:



 

     public partial class MainPage : PhoneApplicationPage
{
int contador = 0;

public MainPage()
{
InitializeComponent();
RellenarLista();
}

private void btnGuardar_Click(object sender, RoutedEventArgs e)
{
EstablecerValor(contador.ToString(), txtEntrada.Text);
RellenarLista();
}

        private string ObtenerValor(string clave)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
return IsolatedStorageSettings.ApplicationSettings[clave].ToString();
else
return default(string);
}

        private void EstablecerValor(string clave, string valor)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
IsolatedStorageSettings.ApplicationSettings[clave] = valor;
else
IsolatedStorageSettings.ApplicationSettings.Add(clave, valor);

IsolatedStorageSettings.ApplicationSettings.Save();
}

        private int CantidadClaves()
{
return IsolatedStorageSettings.ApplicationSettings.Count;
}

        private void RellenarLista()
{
listBox1.Items.Clear();

for (int i = 0; i < CantidadClaves(); i++)
{
listBox1.Items.Add(ObtenerValor(i.ToString()));
}

ActualizarContador();
}

        private void ActualizarContador()
{
contador = CantidadClaves();
}

}

 
Usando archivos

Bueno, ahora usando el proyecto anterior o creando uno nuevo vamos a usar dos botones, uno para guardar en el archivo y otro para cargar sus datos, y dos textbox, uno para escribir y otro para mostrar el contenido de lo guardado.


Tendría el siguiente aspecto:


 

image


 


Los métodos más importantes son el de Guardar y el de Cargar información del archivo.


 


        public void Guardar(string texto, string archivo)
{
using (var almacenamiento = IsolatedStorageFile.GetUserStoreForApplication())
using (var StreamEscritura = new IsolatedStorageFileStream(archivo, FileMode.Create, almacenamiento))
using (var escritor = new StreamWriter(StreamEscritura))
{
escritor.Write(texto);
}
}

        public string Cargar(string archivo)
{
try
{
using (var almacenamiento = IsolatedStorageFile.GetUserStoreForApplication())
using (var StreamLectura = new IsolatedStorageFileStream(archivo, FileMode.Open, almacenamiento))
using (var lector = new StreamReader(StreamLectura))
{
return lector.ReadToEnd();
}
}
catch (IsolatedStorageException e)
{
return «No se ha encontrado el archivo + Excepción: » + e;
}
}
 

La forma de operar con el archivo es muy similar, obtenemos el espacio de almacenamiento de la aplicación mediante GetUserStoreForApplication.


Luego tenemos que usar una instancia de IsolatedStorageFileStream para poder manipular el archivo. Hay que indicar el nombre del archivo, el lugar donde está almacenado y como manipulamos el archivo, tenemos varias opciones para esto, Create, Open, Append, Truncate, etc.


Por último hacemos uso de un objeto StreamWriter o StreamReader para escribir o leer en el archivo.


Os dejo aquí como quedaría todo el código de la aplicación:

 

    public partial class MainPage : PhoneApplicationPage
{

public MainPage()
{
InitializeComponent();
}


private void btnGuardar_Click(object sender, RoutedEventArgs e)
{
Guardar(txtWriter.Text, «archivoPrueba.txt»);
txtWriter.Text = «»;
}

        private void btnCargar_Click(object sender, RoutedEventArgs e)
{
txtLoader.Text = Cargar(«archivoPrueba.txt»);
}

        private void txtWriter_SelectionChanged(object sender, RoutedEventArgs e)
{
txtLoader.Text = «»;
}

        public void Guardar(string texto, string archivo)
{
using (var almacenamiento = IsolatedStorageFile.GetUserStoreForApplication())
using (var StreamEscritura = new IsolatedStorageFileStream(archivo, FileMode.Create, almacenamiento))
using (var escritor = new StreamWriter(StreamEscritura))
{
escritor.Write(texto);
}
}

        public string Cargar(string archivo)
{
try
{
using (var almacenamiento = IsolatedStorageFile.GetUserStoreForApplication())
using (var StreamLectura = new IsolatedStorageFileStream(archivo, FileMode.Open, almacenamiento))
using (var lector = new StreamReader(StreamLectura))
{
return lector.ReadToEnd();
}
}
catch (IsolatedStorageException e)
{
return «No se ha encontrado el archivo + Excepción: » + e;
}
}

}

 

Como veis no es muy complicado hacer uso del IsolatedStorage en WP7 y nos permite tener en local datos de uso frecuente.
Un saludoGuiño