Almacenamiento Aislado

Este artículo es una traducción del artículo original encontrado en: http://create.msdn.com/en-US/education/quickstarts/Isolated_Storage.

 

 

En Silverlight para Windows Phone 7, no hay acceso directo al sistema de archivos en el dispositivo. Esto significa que no puedes guardar o tener acceso a datos en cualquier lugar que elijas.  Sin embargo, Silverlight proporciona para cada aplicación un mecanismo para guardar y acceder a datos en una región específica que sólo la aplicación puede acceder.  Este acceso IO se llama el Almacenamiento Aislado, y  puedes utilizarlo para almacenar y recuperar datos localmente en el dispositivo Windows Phone.

Este artículo muestra cómo utilizar el Almacenamiento Aislado en un dispositivo Windows Phone.  Contiene las siguientes secciones:

  • Introducción al Almacenamiento Aislado.
  • Trabajando con pares Clave/Valor
  • Trabajando con archivos

Introducción al Almacenamiento Aislado

El Almacenamiento Aislado crea un sistema de archivos virtual que sólo la aplicación asociada a ella la puede acceder. Esto significa que una aplicación puede guardar y recuperar datos en su propio Almacenamiento Aislado, pero no puede acceder a los datos de otro Almacenamiento Aislado.

El Almacenamiento Aislado consta de uno o más archivos de Almacenamiento Aislado,  llamados almacenes, los cuales contienen las ubicaciones reales de los directorios en donde se almacenan los datos.

Hay dos maneras de utilizar el Almacenamiento Aislado.  La primera y la más simple es guardar o recuperar los datos como pares clave/valor de un diccionario usando la clase IsolatedStorageSettings.  La segunda forma es guardar o recuperar archivos mediante la clase IsolatedStorageFile.  Las clases IsolatedStorageSettings y IsolatedStorageFile se encuentran en el espacio de nombres System.IO.IsolatedStorage por lo que comúnmente agregarás una directiva using a este espacio de nombres.  

Trabajando con pares Clave/Valor

Para guardar o recuperar datos como pares clave/valor, se utiliza la clase IsolatedStorageSettings.  IsolatedStorageSettings es un diccionario que permite almacenar objetos, tales como cadenas.  IsolatedStorageSettings es ideal para guardar pequeños piezas de datos, tales como configuración de aplicaciones que necesites acceder cuando la aplicación sea cargada o finalizada.  Dos escenarios en los que esto es común, es cuando una aplicación se inicia o es detenida por el usuario, y cuando una aplicación es desactivada.  Para obtener más información sobre tombstoning, consulta el artículo en MSDN Información general sobre el Modelo de Ejecución de Windows Phone.  

Normalmente, se utilizan los siguientes métodos en IsolatedStorageSettings:

·         Add: Añade una entrada en el diccionario para el par clave/valor.

·         Contains: Determina si el diccionario contiene la clave especificada.

·         Remove: Elimina la entrada con la clave especificada.

La siguiente imagen muestra una aplicación de ejemplo que agrega, recupera y elimina un par clave/valor del Almacenamiento Aislado. 

clip_image002

En el siguiente ejemplo se muestra cómo agregar un par clave/valor.  Se crea una instancia de la IsolatedStorageSettings a partir de la propiedad ApplicationSettings.  Se crea en el diccionario una clave denominada "userData".  El valor de "userData" se establece a la propiedad Text de un TextBox.  Finalmente, se guarda la configuración utilizando el método Save.

C#

 

private void btnSaveSetting_Click(object sender, RoutedEventArgs e)

{

IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

// TxtInput es un TextBox definido en XAML.

if (!settings.Contains("userData"))

{

settings.Add("userData", txtInput.Text);

}

else

{

settings["userData"] = txtInput.Text;

}

settings.Save();

}

 

El siguiente ejemplo muestra cómo recuperar datos de un par clave/valor.  Al par clave/valor se accede directamente desde la propiedad ApplicationSettings.  La propiedad Text de un TextBlock se establece al valor de la clave "userData". 

C#

 

private void btnDisplaySetting_Click(object sender, RoutedEventArgs e)

{

// txtDisplay es un TextBlock definido en XAML.

txtDisplay.Text = "USER DATA: ";

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

{

txtDisplay.Text +=

IsolatedStorageSettings.ApplicationSettings["userData"] as string;

}

}

 

En el siguiente ejemplo se muestra cómo eliminar un par clave/valor.  Al par clave/valor se accede directamente desde la propiedad ApplicationSettings.  La clave "userData" se elimina del diccionario mediante el método Remove.

 

C#

 

private void btnRemoveSetting_Click(object sender, RoutedEventArgs e)

{

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

{

IsolatedStorageSettings.ApplicationSettings.Remove("userData");

}

}

 

Trabajando con archivos

Para guardar o recuperar archivos, se utiliza la clase IsolatedStorageFile.  IsolatedStorageFile representa un área de Almacenamiento Aislado que contiene archivos y directorios.  Cuando trabajas con archivos, también sueles utilizar la clase IsolatedStorageFileStream para leer y escribir el contenido en el archivo.  Normalmente, se utilizan los siguientes métodos en IsolatedStorageFile: 

·         GetUserStoreForApplication: Obtiene al Almacenamiento Aislado del usuario que corresponde a la identidad de la aplicación del código de llamado.

·         FileExists: Determina si la ruta de acceso especificada se refiere a un archivo existente en el Almacenamiento Aislado.

·         CreateFile: Crea un archivo en el Almacenamiento Aislado.

·         OpenFile: Abre un archivo en la ruta especificada utilizando las opciones de acceso y compartición. Este método devuelve un objeto IsolatedStorageFileStream que contiene el stream del archivo.

·         DeleteFile: Elimina un archivo en el Almacenamiento Aislado.

·         DirectoryExists: Determina si la ruta de acceso especificada se refiere a un directorio existente en el Almacenamiento Aislado.

·         CreateDirectory: Crea un directorio en el ámbito del Almacenamiento Aislado.

·         DeleteDirectory: Elimina un directorio en el ámbito del Almacenamiento Aislado.

·         Remove: Elimina el ámbito del Almacenamiento Aislado y todo su contenido.

Las instancias de IsolatedStorageFile y IsolatedStorageFileStream debe ser desechadas después de su uso. La declarativa using hace esto por ti de manera automática y su uso es una buena práctica.

En el siguiente ejemplo se crea una aplicación que guarda y recupera un archivo de imagen en el Almacenamiento Aislado.  El ejemplo utiliza un PhotoChooserTask  para obtener una imagen de la biblioteca de fotos en el dispositivo.  Este artículo no entra en detalle sobre el uso del PhotoChooserTask.  Consulta Información general de Ejecutores y Selectores para Windows Phone en MSDN para obtener más información sobre el uso de PhotoChooserTask. 

El siguiente XAML muestra la interfaz de usuario básica para la aplicación.  Un Button para lanzar el selector de fotos y guardar el archivo de imagen, un Button para recuperar el archivo del Almacenamiento Aislado y mostrarlo, y un objeto Image para mostrar el archivo de imagen.

XAML

 

<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<Button Name="btnSaveFile"

Content="Save Image"

Height="100" Width="300"

Click="btnSaveFile_Click"/>

<Button Name="btnDisplayFile"

Content="Display Saved Image"

Height="100" Width="300"

Click="btnDisplayFile_Click"/>

<Image Name="userImage" Source="Sl_Nebula.jpg" />

</StackPanel>

La siguiente imagen muestra la aplicación ejecutando en el emulador de Windows Phone.

clip_image004

El siguiente código crea e inicia el PhotoChooserTask para obtener una imagen y luego guardarla en el Almacenamiento Aislado.  Después de que la imagen ha sido seleccionada, un directorio llamado Images es creado si no existe actualmente.  Después, un IsolatedStorageFileStream es creado para almacenar el archivo.  El método SaveJpeg es usado para guardar los datos de la imagen en el IsolatedStorageFileStream.  

C#

private PhotoChooserTask photoTask;

// Constructor

public MainPage()

{

InitializeComponent();

photoTask = new PhotoChooserTask();

photoTask.Completed += new EventHandler<PhotoResult>(photoTask_Completed);

}

void photoTask_Completed(object sender, PhotoResult e)

{

if (e.TaskResult == TaskResult.OK)

{

BitmapImage bmp = new BitmapImage();

bmp.SetSource(e.ChosenPhoto);

SaveToFile(bmp);

}

}

private void btnSaveFile_Click(object sender, RoutedEventArgs e)

{

photoTask.Show();

}

private void SaveToFile(BitmapImage image)

{

using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())

{

WriteableBitmap bmImage = new WriteableBitmap(image);

if (!store.DirectoryExists("Images"))

{

       store.CreateDirectory("Images");

}

using (IsolatedStorageFileStream isoStream =

store.OpenFile(@"Images\userPhoto.jpg", FileMode.OpenOrCreate))

{

Extensions.SaveJpeg(

bmImage,

isoStream,

bmImage.PixelWidth,

bmImage.PixelHeight,

0,

100);

}

}

}

La siguiente imagen muestra el selector de fotos en el dispositivo.

clip_image006

El siguiente código recupera el archivo de imagen del Almacenamiento Aislado mediante el método OpenFile, y establece la propiedad Source de un objeto Image a esta imagen.

C#

private BitmapImage GetSavedImage()

{

BitmapImage image;

using (IsolatedStorageFile store =

IsolatedStorageFile.GetUserStoreForApplication())

{

using (IsolatedStorageFileStream isoStream =

   store.OpenFile(@"Images\userPhoto.jpg", FileMode.Open))

{

image = new BitmapImage();

image.SetSource(isoStream);

}

}

return image;

}

private void btnDisplayFile_Click(object sender, RoutedEventArgs e)

{

BitmapImage bitmap = GetSavedImage();

if (bitmap != null)

{

// UserImage se define en MainPage.xaml

userImage.Source = bitmap;

}

}

 

La siguiente imagen muestra la aplicación después que el objeto Image se ha actualizado con el archivo de imagen recuperado del Almacenamiento Aislado.

 

clip_image008