[WP7 Tips] Guardar lista de objetos en el IsolatedStorage

Hola que tal, otro tips más para el desarrollo sobre Windows Phone. Les cuento a manera de historia lo que me paso.

Tenía la necesidad de guardar en una lista de objetos los resultados obtenidos en el Pseudo juego del que estaba hablando en los post anteriores, los cuales puedes ver acá:

La pantalla de “Logros” es la siguiente:

image

El tema es el siguiente, para guardar una par key-value, funcionaba impecable, revisemos como se guardar un valor y como podemos recuperarlo posteriormente. Primero para guardar un valor lo podemos hacer de la siguiente manera:

IsolatedStorageSettings.ApplicationSettings["clave"] ="algun valor";

o que es lo mismo:

IsolatedStorageSettings.ApplicationSettings.Add("clave", "algun valor");

Lo que se guardar, como decíamos es un par key-value, en donde el value puede ser un objeto.

Para recuperar el dato almacenado, primero debemos preguntar si existe la clave en la colección ApplicationSettings, lo podemos hacer de la siguiente manera:

if (IsolatedStorageSettings.ApplicationSettings.Contains("clave"))

{

  var valor =IsolatedStorageSettings.ApplicationSettings["clave"];

}

Recuerda que el objeto que se retorna no es tipado, por lo que vas a tener que hacer el cast explícito al lo que desees obtener.

Todo funcionaba perfecto, pero cuando quería guardar una lista de objetos, funcionaba en el emulador sin problemas, pero en el dispositivo no se almacenaban los datos, y yo que pensaba que mi aplicación estaba a minutos de poder ser publicada, asi que comencé la búsqueda de mi error.

La lista de objetos almacenaba puntajes, que tiene la siguiente estructura:

image

Que como vez, ocupo la propiedad cara para tener el nombre de la imagen que muestro, el constructor sirve para determinar mediante el puntaje que ruta de imagen se va a almacenar el cara. Además solo quería guardar los 10 últimos puntajes.

public void guardaResultados(int cont)
{

  List<Puntaje> puntajes = new List<Puntaje>();

  Puntaje p = new Puntaje(DateTime.Now.ToString("dd/MM/yyyy hh:mm tt"),
                          Convert
.ToString(cont));

  if (IsolatedStorageSettings.ApplicationSettings.Contains("puntajes"))

  {

      puntajes = (List<Puntaje>)IsolatedStorageSettings.ApplicationSettings["puntajes"];

   }

   puntajes.Insert(0,p);

   if (puntajes.Count > 10)

   {

      puntajes.RemoveAt(10);

    }

   IsolatedStorageSettings.ApplicationSettings.Remove("puntajes");

   IsolatedStorageSettings.ApplicationSettings.Add("puntajes", puntajes);

   IsolatedStorageSettings.ApplicationSettings.Save();

 

}

Como se ve mi función en sencilla, en donde primero creo la lista de Puntaje, instancio el Objeto Puntaje , luego pregunto si ya existía una lista en el ApplicationSettings, si no existe es que se estaba jugando por primera vez, si no la recuperarnos para ingresarle el nuevo objeto p, insertamos en la primera posición, y si hay más de 10, la removemos.

Luego remuevo lo que estaba ya en la colección ApplicationSettings ,esto lo hice por que me levanto una excepción al querer guardar algo que ya tenia la clave, entonces, luego guardo la lista. El método Save no lo estaba ocupando, lei en la documentación que era el método que debía ocupar para guardar la lista, así que lo utilicé pero se levantaba una excepción que indica lo que estaba pasando, debía serializar las propiedades de mi objeto.

Así que rápidamente agregué en la clase Puntaje el namespace:

using System.Runtime.Serialization;

Luego agregué el atributo a la clase Puntaje:

[DataContract]

    public class Puntaje …

y a las propiedades el respectivo DataMember

[DataMember]

   public string cara { set; get; }

Ejecuté ahora mi aplicación en el teléfono y super! ya estaban funcionando la lista de puntajes de manera persistente, ya no se borraban en cada ejecución, justo lo que necesitaba.

Espero que te sirva este tip.

Saludos

@chalalo

Un comentario en “[WP7 Tips] Guardar lista de objetos en el IsolatedStorage”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *