Hola a todos,

Desde el lanzamiento oficial de Windows Phone 7.0 se debatió mucho sobre la necesidad de una base de datos local, del mismo modo como se hacía en Windows Mobile. Durante más de 12 meses la respuesta oficial de Microsoft fue que WP7 no era un dispositivo 100% empresarial, razón por la cual no había base de datos.

Fue hace 12 meses tan discutible el asunto que sin dudarlo dos veces varios equipos de desarrollo y empresas se embarcaron en una carrera por proveer bases de datos locales, “pagas” y for free. Algunas de las iniciativas más destacadas (y una de las que más usé) fue SiaQoDB HTTP://TINYURL.COM/SIADB, quien vio en WP7 la siguiente plataforma para portar ese proyecto. También hubo esfuerzos destacados de proveer almacenamiento de parte de Microsofties en forma de tutorial para desarrollar proveedores de LINQ: HTTP://TINYURL.COM/3XSVEZZ.

Pues ha pasado el tiempo y las cosas han cambiado, aunque Windows Phone 7.X (7.0, 7.1 y Mango) sigue siendo un dispositivo orientado inicialmente al consumidor final, ya hay una postura oficial de Microsoft de proveer un almacenamiento local a través de SQL Server CE.

Si escucharon bien, el viejo y conocido SQL Server CE está de regreso a Windows Phone “Mango”. Algunos dinosaurios de los móviles (se puede ser dinosaurio en un campo como móviles?) sabemos de la existencia de CE desde hace mucho tiempo, de los múltiples brandings que ha tenido y por supuesto también sabemos de su archi rival (Oracle Lite).

Bien, CE en WP7 viene recargado con LINQ, el ORM por default de Microsoft. Para utilizar CE en Mango el primer paso es crear una base de datos en tiempo de ejecución a través del DataContext o conectar a una existente con la siguiente sintaxis:

TodoDC = new DataContextBase("Data Source='" + DatabaseFilename + "'" +
   (DatabasePassword.Length == 0 ? "" : ";Password='" + DatabasePassword + "'"));

No sobra recordar que CE está basado en un archivo local con extensión *.sdf y que éste archivo para WP7 se guarda en el IsolatedStorage que tiene la aplicación. El siguiente paso lógico (como en cualquier ORM) es “mapear” nuestros objetos de negocio o entidades a objetos de la base de datos, esto quiere decir que debemos agregar atributos a nuestras clases para que puedan representar registros en una tabla, por ejemplo:

[Table]
public partial class Task
{
    public TaskStatus Status { get; set; }

    public System.Guid ProjectID { get; set; } 

    public System.Nullable DueDate { get; set; }
}

El último paso consiste en ejecutar la sentencia DML que necesitemos, por ejemplo, utilizando LINQ-to-SQL, agregar un registro a la tabla Task sería simplemente utilizando objetos mapeados, así:

...
// Create an initial task
Task items = new Task();
items.ItemID = Guid.NewGuid();
items.Title = "Welcome to the \"Todo\" application!";
items.Completed = true;
todo.Items.InsertOnSubmit(items);

todo.SubmitChanges();
.

Fácil, no? . En general esto bueno para los desarrolladores de aplicaciones, pero en especial para las aplicaciones empresariales o aquellas con gran dependencia de datos. Para más información sobre:

IsolatedStorage: http://wp.me/p17pRQ-5

SQL Server CE: http://tinyurl.com/3q4hgu3

SQL Server CE en WP7: tutorial “Using local database in To-do application” del “Windows Phone codenamed Mango Training Course”

Saludos,

Javier Andrés Cáceres Alvis
Microsoft MVP – Windows Phone