Sin duda una de las tecnologías que como desarrollador han mejorado mi productividad son los ORM. Hoy vengo a hablaros de Vici.CoolStorage un ORM cross platform para MonoTouch, MonoDroid y WP7 (y seguramente W8). Podéis descargarlo desde la página del proyecto.

Voy a ilustrar un ejemplo con MonoTouch en el que tendremos una clase persona:

[MapTo("Persona")]

public class Persona : CSObject<Persona,int>{

public int Id {

get;

set;

}

public string Nombre {

get;

set;

}

public string Apellidos {

get;

set;

}

}

Este código sería válido para MonoDroid y WindowsPhone pero, puesto que en el caso de MonoTouch no se soporta Reflection.Emmit, y CoolStorage la utiliza para su funcionamiento, debemos añadir el siguiente código en los getters/Setters:

[MapTo("Persona")]

public class Persona : CSObject<Persona,int>{

public int Id {

get { return (int)GetField("Id"); }

}

public string Nombre {

get { return (string)GetField("Nombre"); }

set { SetField("Nombre",value); }

}

public string Apellidos {

get { return (string)GetField("Apellidos"); }

set { SetField("Apellidos",value); }

}

}

Una vez hemos definido la clase, debemos conectarnos a la base de datos y, sólo en caso de que no exista previamente, crearla. Para ello hemos preparado el siguiente método:

void ComprobarYCrearLaDB{

string dbNombre = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), "db");

CSConfig.SetDB (dbNombre,SqliteOption.CreateIfNotExists, () => {

CSDatabase.ExecuteNonQuery (

"CREATE TABLE Persona (Id INTEGER PRIMARY KEY AUTOINCREMENT," +

"Nombre text, Apellidos text)");

//Datos de ejemplo

Persona p = new Persona(){ Nombre="Jose", Apellidos="Gónzalez"} ;

p.Save();

p = new Persona(){ Nombre="Antonio", Apellidos="Gónzalez"} ;

p.Save();

} );

}

Con CSConfig.SetDb indicamos que se cree la base de datos, y el método que se ejecutará cuando se cree. En nuestro ejemplo creamos la tabla Persona en la base de datos, para a continuación crear unos datos de prueba que guardamos gracias al método Save.

Finalmente, creamos la interfaz de usuario en el punto de entrada de la aplicación:

public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            window = new UIWindow (UIScreen.MainScreen.Bounds);


            ComprobarYCrearLaDB();
            //Se crea la interfaz de usuario

            var root = new RootElement("Personas");
            var section = new Section("Personas");
            foreach (var p in Persona.List()) {
                section.Add(new StringElement(string.Format("{0} {1}",p.Nombre,p.Apellidos)));
            }
            root.Add(section);
            var dialog = new DialogViewController(UITableViewStyle.Plain,root);
            dialog.Root=root;


            window.RootViewController = dialog;
            window.MakeKeyAndVisible ();

            return true;
        }

Como veis es muy fácil comenzar con este ligero ORM. Además aunque no lo hemos visto, soporta transacciones y relaciones.  Aquí encontrareis el fichero de código completo.