Almacenamiento local de datos en Windows Phone
Almacenamiento de datos en WP7
La programación de aplicaciones para Windows Phone tiene, a mi modo de ver, un defecto importante en lo que se refiere a almacenamiento de datos. En esta plataforma no existe una Base de Datos interna del teléfono donde podamos guardar y acceder a los datos de nuestra aplicación. No sé si en un futuro esto cambiará pero de momento Microsoft sigue con su idea de almacenamiento en la nube. Es decir, la filosofía de Windows Phone es utilizaar Internet para guardar todos los datos. No es una mala teoría porque los datos estarían a salvo de problemas con el dispositivo y serían accesibles siempre, pero si no tenemos una tarifa de datos estamos perdidos.
En este post trataré de explicar las diferentes opciones para almacenar datos que tenemos. Básicamente son 2: Isolated Storage o almacenamiento en local y almacenamiento en Base de Datos en la nube. En este post nos centraremos en el almacenamiento con Isolated Storage.
¿Qué es Isolated Storage?
El almacenamiento de datos con Isolated Storage o almacenamiento aislado es una forma de guardar los datos en archivos locales que lleva en uso desde Silverlight 2. Solo nuestra aplicación tiene acceso a sus archivos, por eso se llama almacenamiento aislado. No es posible compartir datos entre dos aplicaciones con este sistema.
El almacenamiento de datos con Isolated Storage o almacenamiento aislado es una forma de guardar los datos en archivos locales que lleva en uso desde Silverlight 2. Solo nuestra aplicación tiene acceso a sus archivos, por eso se llama almacenamiento aislado. No es posible compartir datos entre dos aplicaciones con este sistema ya que no son visible entre dos espacios de aplicación diferentes.
Existen dos tipos de almacenamiento en local. Usando almacenamiento de pares clave y valor (IsolatedStorageSettings) y usando archivos y directorios (IsolatedStorageFile).
IsolatedStorageSettings
Este tipo de almacenamiento permite guardar parejas de nombre y valor directamente en tu dispositivo (sin necesidad de crear ni administrar la lista de datos). Una vez guardados los datos podemos recuperarlos mediante su clave.
La información permanecerá en el teléfono mientras la aplicación no se desinstale o se borre desde la aplicación. No se pierde al apagar el teléfono. En el siguiente código se implementa una función de almacenaje y otra de recuperación.
private void SaveValue(string clave, string valor)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
IsolatedStorageSettings.ApplicationSettings[clave] = valor;
else
IsolatedStorageSettings.ApplicationSettings.Add(clave, valor);
IsolatedStorageSettings.ApplicationSettings.Save();
}private string RetrieveValue(string clave)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains(clave))
return IsolatedStorageSettings.ApplicationSettings[clave].ToString();
else
return default(string);
}Podemos saber la cantidad de pares clave-valor que hemos guardado mediante la función:
IsolatedStorageSettings.ApplicationSettings.Count
IsolatedStorageFile
Mediante el método IsolatedStorageFile nuestra aplicación será capaz de guardar datos de la aplicación en ficheros locales localizados en la partición privada de nuestra aplicación. Podemos gestionar carpetas para organizar mejor nuestros datos si queremos.
En la siguiente función podemos ver como guardar un objeto (instáncia de clase) en el archivo datos.xml.
public static void StoreObject(Object obj)
{
IsolatedStorageFile appStore = IsolatedStorageFile.GetUserStoreForApplication();
using (IsolatedStorageFileStream fileStream = appStore.OpenFile("datos.xml", System.IO.FileMode.Create))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(Object));
serializer.WriteObject(fileStream, obj);
}
}Y ahora recuperaremos el dato del fichero:
public static Object RetrieveObject()
{
Object obj = default(Object);
IsolatedStorageFile appStore = IsolatedStorageFile.GetUserStoreForApplication();
if (appStore.FileExists("datos.xml"))
{
using (IsolatedStorageFileStream fileStream = appStore.OpenFile("datos.xml", System.IO.FileMode.Open))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(Object));
obj = (Object)serializer.ReadObject(fileStream);
}
}
return obj;
}Aquí os dejo un artículo de “Un Informático en Construcción” que está muy bien y donde guardan textos en IsolatedStorageFile, por si os interesa.
Espero haber sido de ayuda. Iremos ampliando el contenido de nuestros tutoriales para Windows Phone 7.
Y para que os pongáis tontorrones os dejo este temazo de Daughtry:
Uso del control Popup en WP7
En este post intentaremos profundizar un poco en el uso del Control Popup en aplicaciones para Windows Phone 7. Crearemos una simple aplicación que muestre un menú dentro de un popup emergente. Lo primero será añadir un par de iconos que utilizaremos en nuestro Application bar. Al añadir un icono a nuestro proyecto es de vital importancia cambiar ciertas propiedades. El campo Build Action debe tener valor Content y el campo Copy to Output Directory debe ser Copy if newer. Si no seleccionamos estos parámetros no se mostrarán nuestros iconos en la aplicación.
Empecemos con el código, ésta es la definición XAML de nuestro Popup:
<Popup x:Name="ContextMenuPopup" Height="364" Width="389" Margin="38,0,29,6" VerticalAlignment="Bottom" HorizontalAlignment="Center">
<ListBox FontSize="40" SelectionChanged="ListBox_SelectionChanged">
<ListBoxItem Content="Item Number 1" />
<ListBoxItem Content="Item Number 2" />
<ListBoxItem Content="Item Number 3" />
<ListBoxItem Content="Item Number 4" />
</ListBox>
</Popup>Como podemos ver, el código anterior simplemente define un objeto Popup llamado ContextMenuPopup de 364 píxels de altura y 389 de ancho. Dentro definimos un ListBox que contendrá los items de nuestro menú. En este caso cargaremos 4 items.
Este Popup por defecto será invisible en la iterfaz de usuario. Ahora veremos como mostrarlo en el evento click de un item que hemos definido en la ApplicationBar:
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
ContextMenuPopup.IsOpen = true;
}Como vemos es muy simple hacer visible nuestro Popup. De igual manera se puede hacer invisible:
ContextMenuPopup.IsOpen = false;En nuestra aplicación haremos invisible el Popup al hacer click en uno de sus items y seguidamente cargaremos una página diferente.
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ContextMenuPopup.IsOpen = false;
var sel = ((ListBox)ContextMenuPopup.Child).SelectedItem;
switch (((ListBoxItem)sel).Content.ToString())
{
case "Item Number 1":
NavigationService.Navigate(new Uri("/Pages/Page1.xaml", UriKind.Relative));
break;
case "Item Number 2":
NavigationService.Navigate(new Uri("/Pages/Page1.xaml", UriKind.Relative));
break;
case "Item Number 3":
NavigationService.Navigate(new Uri("/Pages/Page1.xaml", UriKind.Relative));
break;
case "Item Number 4":
NavigationService.Navigate(new Uri("/Pages/Page1.xaml", UriKind.Relative));
break;
}
}Es una aplicación muy simple pero que espero os sirva para entender mejor este control.
Aquí os podéis descargar el código:
Archivo: PopupControl.zip
Y que mejor que escuchar canciones potentes como esta mientras programas, ahí os dejo la coletilla:
Detectar si hay conexión de datos en WP7
En esta entrada explicaremos como detectar si existe conexión de datos en nuestra aplicación Windows Phone. Nos puede ser de mucha utilidad si queremos controlar errores en nuestra aplicación si es que esta utiliza acceso a la nube. La función es muy simple, detecta si hay conexión Wifi, 3G, etc. y devuelve el resultado.
Empezaremos añadiendo la referencia a System.Net.NetworkInformation.
using System.Net.NetworkInformation;Y esta sería nuestra función:
private bool InternetIsAvailable()
{
if (!NetworkInterface.GetIsNetworkAvailable())
{
MessageBox.Show("No tienes conexión de internet.");
return false;
}
else
{
MessageBox.Show("Tienes conexión de internet.");
return true;
}
}Un ejemplo de como se llama a la función desde el programa principal de la página.
public MainPage()
{
InitializeComponent();
if (InternetIsAvailable())
{
textBox1.Text = "Conectado a Internet";
}
else
{
textBox1.Text = "No Conectado a Internet";
}
}Aquí os podéis descargar el código:
Archivo: ConnectionTest.zip
Que menos que rematar este post con un tema de los que hacen época… Broken Wings de Alter Bridge. A disfrutar!
A vueltas con .NET: ComboBox Multi-Columna
Aunque parezca mentira Visual Basic 2008 no incorpora por defecto un ComboBox capaz de mostrar varias columnas de datos. La única manera de hacerlo es programarlo nosotros mismos o buscar ese control por Internet.
Como ya os imaginais a estas alturas, no vamos a inventar nada que ya esté inventado y funcione perfectamente. Por tanto, vamos a añadir el control capaz de hacer lo que queremos y explicar cómo utilizarlo para mostrar los datos que nos interese. En nuestro caso vamos a utilizar el control Icon ComboBox, creado por Steve McMahon, de la conocida página vbaccelerator
![]()
¿Cómo añadir el control a nuestro proyecto?
Lo primero será descargar el control.
Una vez descargado tenemos que añadir el control al toolbox de nuestro proyecto. Clickando con el botón derecho del ratón encima del toolbox marcamos “Choose Items“, dentro del nuevo menú le damos a Browse y seleccionamos el archivo .dll del control.
Llegados a éste punto tenemos el nuevo control añadido al toolbox y listo para usarse. Lo siguiente será añadir el control al formulario, declararlo, modificar los aspectos visuales y empezar a pasarle valores. Vamos a ello.
Añadir el control al formulario se hace igual que cualquier otro control de los que vienen por defecte en Visual Studio, por tanto arrastramos el control al formulario y empezamos a trabajar con él.
Declaramos el control. Como veis se trata de definir cuántas columnas va a tener el control y el espacio que van a ocupar:
Dim column As IconComboBoxColumn = New IconComboBoxColumn 'Por defecto el control ya trae una columna, sólo cambiamos su tamaño IconComboDepartamento.Columns(0).ColumnWidth = 128 'Segunda columna column.ColumnWidth = 32 IconComboDepartamento.Columns.Add(column) 'Tercera columna column = New IconComboBoxColumn column.ColumnWidth = 96 IconComboDepartamento.Columns.Add(column)
Ya tenemos el control declarado, ahora solo falta poblarlo y mostrarlo. El método para poblar el control consiste en añadirle Items, cada item es una linea del combobox y a cada item le añadiremos tantos subitems como columnas tengamos en el control. Con el ejemplo queda más claro.
Dim ici As IconComboItem = New IconComboItem ici.Text = "Informática" Dim subitem As IconComboSubItem = New IconComboSubItem subitem.Text = "5 trabajadores" ici.SubItems.Add(subitem) subitem = New IconComboSubItem subitem.Text = "Piso superior" ici.SubItems.Add(subitem) IconComboDepartamento.Items.Add(ici)
De éste manera hemos añadido una linea al combobox de 3 columnas.
A vueltas con .NET: Modificar Connection Strings en Runtime
Esto del .NET me parece alucinante, la de cosas que se pueden llegar a hacer de forma rápida y sencilla es enorme. Sin hablar de la cantidad ingente de ejemplos y ayuda que podemos encontrar por Internet. Sin embargo, me he encontrado con un problema.
En una aplicación que estoy haciendo necesito poder leer los datos de diferentes bases de datos en función del dominio en el que se ha autentificado el usuario. Las bases de datos corresponden a diferentes fábricas alrededor del mundo así que necesito poder cambiar el ConnectionString que utilizan los DataSets en tiempo de ejecución. Después de indagar ésto es lo que he conseguido, espero que alguien le ayude.
Lo primero que debemos hacer es declarar los diferentes ConnectionString que podemos utilizar, en nuestro caso lo haremos dentro de My Project -> Settings.

En mi caso tengo 3 Connection Strings, uno de ellos (ConnectionString) es el que utilizan los diferentes DataSets y los otros dos (SpainConnectionString y ChinaConnectionString) son los diferentes valores que puede tomar la primera variable. En la misma pantalla de Settings le damos a ViewCode y saltaremos al código de la clase Settings que nos permite utilizar eventos específicos de esa clase.
Namespace My
'This class allows you to handle specific events on the settings class:
' The SettingChanging event is raised before a setting's value is changed.
' The PropertyChanged event is raised after a setting's value is changed.
' The SettingsLoaded event is raised after the setting values are loaded.
' The SettingsSaving event is raised before the setting values are saved.
Partial Friend NotInheritable Class MySettings
Public WriteOnly Property ChangeConnectionString() As String
Set(ByVal Value As String)
My.Settings("ConnectionString") = Value
End Set
End Property
End Class
End Namespace
Éste es el código que modifica el valor de la variable ConnectionString (también se puede utilizar para cambiar culaquier valor de la clase My Setting), ahora debemos llamar a éste proceso con el valor que nos interese.
En nuestro caso miramos el dominio del usuario y el rango de IP’s del usuario.
Private Sub GetDomain(ByVal HostName As String) 'Buscamos el dominio al que corresponde la ip que tenemos asignada, 'no el dominio al que nos hemos 'logueado desde Windows Dim Direcciones As IPAddress() = Dns.GetHostAddresses(HostName) 'Recorremos todos los posibles dominios y cargamos el portal del dominio correspondiente Select Case Mid(Mid(Direcciones(0).ToString(), 9), 1, InStr(Mid(Direcciones(0).ToString(), 9), ".") - 1) Case My.Settings.SPAIN_IP My.Settings.ChangeConnectionString = My.Settings.SPAINConnectionString Case My.Settings.CHINA_IP My.Settings.ChangeConnectionString = My.Settings.CHINAConnectionString Case Else 'Si llegamos aqui es que no estamos en ningun dominio conocido, por tanto cerramos el portal End Select End Sub
Espero que os sea de ayuda.
A vueltas con .NET: Minimizar formulario en la barra de tareas
Desde hace algún algo más de un mes estoy aprendiendo a programar con en .Net con Visual Basic 2008. Lo estoy haciendo totalmente auto-didacta así que hasta dentro de un tiempo no habrá gran cosa… Se me ha ocurrido colgar todas las dudas que me asalten y encuentre su solución en “El Interné”, por si a alguien le puede servir de ayuda.
El caso de hoy trata de minimizar nuestro formulario y colocarlo en la barra de tareas de Windows (System Tray), no es gran cosa pero es un comienzo, no?
Lo que debemos hacer es añadir un NotifyIcon a nuestro formulario y, si queremos que quede más bonito, añadirle un ContextMenu. La finalidad de éste control es crear un menú cuando hagamos click encima del NotifyIcon. Añadimos el siguiente codigo al evente de cerrar del formulario que queremos ocultar.
'En lugar de cerrar el programa lo vamos esconder y mostrar el icono del IconTray Private Sub frmPortal_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing 'Primero lo minimizamos Me.WindowState = FormWindowState.Minimized Me.ShowInTaskbar = True 'Ahora lo hacemos invisible y cancelamos el evento de cerrar Me.Visible = False e.Cancel = True End Sub
Hasta ahora lo que hemos echo es esconder el formulario pero todavia no veremos ningún icono en la barra de tareas.
En mi caso no voy a usar un ContextMenu,lo que me interesa es que cuando se haga click encima del NotifyIcon el formulario vuelva a aparecer.
'Hacer click en el icono significa volver a abrir la aplicacion Private Sub NotifyIcon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotifyIcon.Click 'Primero lo maximizamos Me.WindowState = FormWindowState.Maximized 'Refrescamos los controles del formulario, sólo por nitidez. Me.Refresh() 'Lo volvemos a hacer visible Me.Visible = True Me.BringToFront() End Sub
Llegados a este punto me encontré con un problema, si tenía mas ventanas abiertas el formulario aparecía detrás de todas ellas. Teniendo en cuenta que es un aplicación que me interesa que esté siempre delante del todo utilizé la propiedad TopMost del formulario.
Mi Manual de Windows Phone
Ultimos Posts
- Windows Phone Developer Tools 7.1 Beta
- Cambia el tema del emulador de Windows Phone
- Algunos tutoriales de Windows Phone 7 (Parte 3)
- Grabador de voz en Windows Phone
- Cambiar teclado de TextBox en WP7
- Sobre el diseño Metro para programadores de WP7
- Base de datos XML en Windows Phone 7
- Windows Phone 7 Isolated Storage Explorer
- Almacenamiento local de datos en Windows Phone
- Uso del control Popup en WP7
Windows Phone
Nuestras lecturas
Windows Phone Blog
Blankenblog
Libre y extremo











