SQLite en Windows Phone

marzo 27, 2012 | By | 3 Replies More

SQLite es una pequeña base de datos relacional utilizada en un gran número de proyectos. Por defecto se encuentra incluida tanto en iOS como en Android. Existe un proyecto llamado, C# Sqlite for WP7 el cual nos permite contar con un port de SQLite para Windows Phone. Básicamente el núcleo fue modificado para que este utilizara el IsolatedStorage. En este post, realizaremos una pequeña aplicación en Windows Phone que guarde y lea datos en una base de datos SQLite.

Antes de comenzar y teniendo en cuenta que contamos como SQL Server CE en Windows Phone, seguramente te estarás preguntando: ¿Qué beneficios me podría dar el hecho de usar SQLite?. Es simple, si te gustaría alguna vez desarrollar una aplicación que pueda ser portada relativamente fácilmente de Windows Phone a otras plataformas como iOS y Android y además poder reutilizar gran parte del código, incluyendo el acceso a datos, SQLite for Windows Phone es para ti. Si ya has leído los artículos de este sitio, seguramente ya te habrás dado cuenta que gracias a los proyectos MonoTouch y Mono For Android, los cuales permiten desarrollar aplicaciones con C# en iOS y Android respectivamente, esto es posible.

En este articulo únicamente veremos cómo utilizar SQLite en Windows Phone, posiblemente en posteriores posts publiquemos ejemplos más en concreto, de cómo reutilizar y compartir código entre Windows Phone, Mono For Android y MonoTouch. Pues bien, para no darle mas vueltas al asunto comencemos a desarrollar el ejemplo. (Código del ejemplo )

Librerías

Antes de comenzar, tenemos que descargar las librerías necesarias. La primera que hay que descargar es la librería C# Sqlite For WP7. Una vez que la tengas en tu equipo, observaras que existen dos archivos: Community.CsharpSqlite.WP7.dll el cual corresponde al port de SQLite y Community.CsharpSqlite.SqlLiteClient.WP7.dll. Si revisas los ejemplos que vienen en la pagina, veras que se puede acceder a SQLite para Windows Phone, como con cualquier otro proveedor de bases de datos de .Net, como por ejemplo SQL Server. El siguiente trozo de código que viene en la página principal de proyecto es ejemplo de ello:

IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
isf.DeleteFile("test.db");
 
using (SqliteConnection conn = new SqliteConnection("Version=3,uri=file:test.db"))
{
    conn.Open();
 
    using (SqliteCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "CREATE TABLE test ( [id] INTEGER PRIMARY KEY, [col] INTEGER UNIQUE, [col2] INTEGER, [col3] REAL, [col4] TEXT, [col5] BLOB)";
        cmd.ExecuteNonQuery();
 
        cmd.Transaction = conn.BeginTransaction();
        cmd.CommandText = "INSERT INTO test(col, col2, col3, col4, col5) VALUES(@col, @col2, @col3, @col4, @col5);SELECT last_insert_rowid();";
        cmd.Parameters.Add("@col", null);
        cmd.Parameters.Add("@col2", null);
        cmd.Parameters.Add("@col3", null);
        cmd.Parameters.Add("@col4", null);
        cmd.Parameters.Add("@col5", null);
 
        DateTime start = DateTime.Now;
        this.lstResult.Items.Add("Inserting 100 Rows with transaction");
 
        for (int i = 0; i < 100; i++)
        {
            cmd.Parameters["@col"].Value = i;
            cmd.Parameters["@col2"].Value = i;
            cmd.Parameters["@col3"].Value = i * 0.515;
            cmd.Parameters["@col4"].Value = "สวัสดี な. あ · か · さ · た · な · は · ま · や · ら · わ. 形容詞 hello " + i;
            cmd.Parameters["@col5"].Value = Encoding.UTF8.GetBytes("สวัสดี");
 
            object s = cmd.ExecuteScalar();
        }
        cmd.Transaction.Commit();
        cmd.Transaction = null;
        this.lstResult.Items.Add("Time taken :" + DateTime.Now.Subtract( start ).TotalMilliseconds + " ms.");
 
        cmd.CommandText = "SELECT * FROM test";
        using (SqliteDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                var bytes = (byte[])reader.GetValue(5);
                this.lstResult.Items.Add(string.Format("{0},{1},{2},{3},{4}, {5}",
                    reader.GetInt32(0),
                    reader.GetInt32(1),
                    reader.GetInt32(2),
                    reader.GetDouble(3),
                    reader.GetString(4),
                    Encoding.UTF8.GetString(bytes, 0, bytes.Length)));
            }
        }
 
        conn.Close();
    }
}

Pero en nuestro caso, vamos a hacerlo diferente. Para acceder a SQLite, vamos a utilizar la librería Sqlite-net de Frank A. Krueger el desarrollador de iCircuit. Sqlite-net es una pequeña librería y ORM que permite un fácil acceso a SQLite. Esta escrita en C# y por lo tanto es multiplataforma, ya que puede ser utilizada también en proyectos de Mono For Android y MonoTouch. De los archivos del proyecto, el que nos interesa es el archivo llamado SQLite.cs .

Desarrollo de la aplicación

En Visual Studio, crea un nuevo proyecto llamado  WPSqlite:

Después, dentro de la solución, agrega un nuevo proyecto del tipo librería de clases para Windows Phone, llamado PhoneClassLibrary1.

En el proyecto PhoneClassLibrary1 agrega las referencias hacia la librería Community.CsharpSqlite.WP7 y también coloca la clase SQLite.cs. Después agrega una clase llamada Articulos, la cual deberá de contener el siguiente código:

using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Linq;
using SQLite;
 
namespace PhoneClassLibrary1
{
    public class Articulos
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        [MaxLength(100)]
        public string Nombre { get; set; }
    }
}

La clase Articulos, representa una tabla en la base de datos, y sus propiedades representan las columnas de la tabla. Observa que en la propiedad Id se está especificando mediante los atributos que dicho campo es la clave primaria y es del tipo autoincremental. En la propiedad Nombre del tipo string, se está especificando que esta tendrá un máximo de 100 caracteres. Representar las tablas por medio de las clases es algo bastante practico y que nos ahorrar muchas líneas de código.

Dentro del proyecto WPSqlite , a la pantalla MainPage agregale un TextBox llamado txtNombre, un ListBox llamado lstArticulos y un botón llamado btnAgregar. La pantalla deberá de lucir de la siguiente manera:

En el ListBox mostraremos los artículos almacenados en la base de datos. El botón contendrá el código para ir agregando artículos, el nombre de cada artículo ha agregar será especificado en el TextBox. Después, en el proyecto WPSqlite, agrega la referencia al proyecto PhoneClassLibrary1.

Con esto, ya estamos listos para agregar las líneas de código. En el código de C# de Main Page agrega el using para la librería SQLite y PhoneClassLibrary1. En la clase vamos a declarar un objeto del tipo SQLiteConnection que es el que nos permitirá crear y conectarnos a la base de datos. Para conectarnos a la base de datos vamos a crear un método llamado OpenDB:

private void OpenDB()
{
  db = new SQLiteConnection("stocks.db");
  db.CreateTable();
}

Lo que estamos haciendo en este método es conectarnos a la base de datos llamada stocks.db, este nombre es pasado como parámetro al constructor. Si la base de datos no existe, se crea de forma automática. Con el método CreateTable se crea la tabla en base a las propiedades de la clase que estamos especificando, esto en caso de que no existiera .

Después, creamos el método llamado AddStock, el cual nos permitirá almacenar registros en la base de datos:

public static void AddStock(SQLiteConnection db, string nombre)
{
  db.Insert(new Articulos(){Nombre = nombre});
}

En este método, pasamos como parámetro el objeto de conexión y el valor que vamos a almacenar en la tabla como registro. Ya en el método, al objeto db por medio del método Insert le pasamos como parámetro una instancia de la clase Articulos, a la cual en su propiedad le asignamos el valor de la variable nombre que estamos pasando como parámetro. Para obtener los registros, crearemos el método llamado QueryArticulos de la siguiente manera:

public static IEnumerable QueryArticulos(SQLiteConnection db)
{
   return db.Query("select * from Articulos");
}

Al igual que en los anteriores métodos, le estamos pasando como parámetro el objeto del tipo SQLiteConnection. Con este objeto, por medio del método Query podemos realizar consultas directamente en la base de datos, esta nos retorna los registros como objetos del tipo Articulos. Con esto ya tenemos los métodos que nos permitirán conectar, insertar y consultar en la base de datos. Ahora crearemos el método para llenar el ListBox .

private void LoadList()
{
   lstArticulos.Items.Clear();
   foreach (var x in QueryArticulos(db))
   {
      lstArticulos.Items.Add(x.Nombre.ToString());
   }
}

Lo que estamos haciendo en este metodo, es realizar la consulta y recorrer los resultados para agregarlos como ítems dentro del ListBox.

Ahora, en el constructor del MainPage llama a los métodos OpenDB y LoadList, para que cuando se cargue la aplicación , se abra la conexión hacia la base de datos, y de ser necesario, esta se cree.

public MainPage()
{
   InitializeComponent();
   OpenDB();
   LoadList();
}

Por último, en el evento Click del botón btnAgregar, llamaremos al método AddStock y le pasaremos como parámetro el valor que haya sido introducido en txtNombre. Para actualizar el ListBox, se hace llamada al método LoadList.

private void btnAgregar_Click(object sender, RoutedEventArgs e)
{
   AddStock(db, txtNombre.Text.Trim ());
   LoadList();
}

Ejecuta el proyecto y si todo es correcto, deberás de obtener:

Como puedes observar, el ejemplo es muy sencillo, pero espero que te de una idea de lo fácil que es usar SQLite en Windows Phone y aun mas haciéndolo en conjunto con el ORM Sqlite-net. En la página oficial de Sqlite-net existen más ejemplos de código para consultar. El código del ejemplo lo puedes descargar desde este enlace.

Si deseas ver un ejemplo aun mas completo , que ademas de Windows Phone se encuentre disponible para iOS y Android, checa la aplicación no oficial que Xamarin desarrollo para el Mobile World Congress del 2012.

Tags: ,

Category: Desarrollo Móvil

About the Author ()

Comments (3)

Trackback URL | Comments RSS Feed

  1. ivan dice:

    hola

    hice todos lo que mencionas en el tutorial pero al momento de ejecutar me marca error

    Error 1 No se puede encontrar el archivo de metadatos ‘C:\Users\NV5313E\Documents\Visual Studio 2010\Projects\WPSqlite\PhoneClassLibrary1\Bin\Debug\PhoneClassLibrary1.dll’ WPSqlite

    no entiendo por que si lo debe de generar por que no lo crea, espero puedas ayudarme, saludos

  2. Hugo Gómez Arenas dice:

    Hola Ivan, gracias por visitar el sitio .
    En el proyecto WPSqlite , agregaste la referencia al proyecto PhoneClassLibrary1?. Por el momento es lo que se me viene a la mente. Tambien podrías verificar los permisos de escritura de las carpetas del proyecto, tal vez no le esta permitiendo a visual studio generar la dll precisamente por permisos. Ya probaste limpiando la solución?

    Para probar si no es algo de tu entorno de desarrollo, podrías descargar el código del ejemplo y probarlo, viene casi al final del post.

Leave a Reply


4 + = seis