Componente SQLite.Net en Xamarin Android (Parte II)

19 febrero, 2014 | By | 8 Replies More

monkey

 

En el anterior post, hablamos un poco acerca de algunas de las opciones que tenemos para el acceso a bases de datos SQLite desde Xamarin Android. En este post, comenzaremos con la creación de un sencillo ejemplo, en donde utilizaremos el componente SQLite.Net disponible desde el sitio de Xamarin. Como podrás observar conforme avances en este ejemplo, SQLite.Net es una librería bastante poderosa, ya que nos permite ahorrarnos un considerable número de lineas de código y evitar tareas repetitivas a lo que a la base de datos SQLite se refiere. Ademas, recordemos que al ser una libreria cross platform , y si es utilizada de forma apropiada, podremos aprovechar una gran cantidad de código para otras plataformas.

Esta entrada es parte del  Curso de Xamarin Android Gratis

El objetivo

El objetivo de este ejemplo, es de crear una sencilla aplicación que nos permita almacenar los datos de clientes (nombre y dirección) y mostrar en una lista los registros almacenados. Se trata de un ejemplo de introducción, sencillo y rápido que solo ilustra la utilización del componente y de manera general sus características.

sqlite-net-ejemplo1

Desarrollo del Ejemplo

Crea una nueva solución en Xamarin o Visual Studio del tipo Android Application llamado SqliteNetExample.

sqlite-net-proyecto

Agregamos el componente SQLiteNet desde la página de componentes de Xamarin, haciendo clic derecho en la carpeta “Components” y dando clic en la opción “Get More Components”.

sqlitenet-xamarin-store

sqlitenet-xamarin-store-2

Una ves que hayas agregado el componente, de manera automática se creara en nuestro proyecto una referencia a la libreria SQLite.dll, con eso estamos listos para comenzar a programar nuestra app de ejemplo.

La interfaz gráfica consistirá básicamente de dos EditText, uno para el nombre y otro para la dirección del cliente, un Button que al ser presionado guardara el registro del cliente y un ListView en donde se visualizarán los registros almacenados en la base de datos. Esta la guardaremos en un layout llamado Main.axml.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:text="Nombre del cliente"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView1" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtName" />
    <TextView
        android:text="Dirección"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView2" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtAddress" />
    <Button
        android:id="@+id/btnAddCustomer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Agregar cliente" />
    <ListView
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lstCustomers" />
</LinearLayout>

Al ser SQLite.Net un pequeño ORM, las tablas de nuestra app deben ser representadas por medio de clases. Como nuestro ejemplo solo necesita de una tabla para los Clientes, creamos dentro de una carpeta llamada “Models” la clase Customers, la cual tiene propiedades que representan cada una de las columnas de la tabla: Id, Name, Address.

using System;
using SQLite;

namespace SqliteNetExample.Models
{
     public class Customer
     {
          [PrimaryKey, AutoIncrement]
          public int Id { get; set; }
          public string Name { get; set; }
          public string Address { get; set; }
     }
}

Como podrás observar, estamos definiendo a la propiedad Id como llave primaria auto incremental a través de los atributos PrimaryKey y AutoIncrement.

Creamos la actividad llamada MainScreen y la definimos como la actividad principal. Agregamos las referencias a los espacios de nombres SQLite y SQliteNetExample.Models ( para utilizar el modelo previamente creado). Así mismo, definimos la instancia de la clase SQLiteConnection llamada “db”. La clase SQLiteConnection es en si la que nos permite realizar operaciones sobre la base de datos.

using SQLite;
using SqliteNetExample.Models;

namespace SqliteNetExample
{
	[Activity (Label = "SqliteNetExample", MainLauncher = true)]
	public class MainScreen : Activity
	{
            SQLiteConnection db;
            EditText txtName;
            EditText txtAddress;
            ListView lstCustomer;

Creamos el metodo llamado “LoadConnection”, en el se define el nombre de la base de datos y se crea la instancia de la clase SQLiteConnecion, si la base de datos no ha sido creada esta se crea de forma automática. Observa que antes de crear la instancia, se verifica si el archivo de la base de datos existe, de esta forma si la base de datos es creada, mas abajo se crean las tablas necesarios por medio del metodo CreateTable<T>().

//Crea la conexión con la base de datos
private void LoadConnection()
{
   string folder = System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal);
   string dbPath = System.IO.Path.Combine (folder, "bussines3.db");

   bool exist = File.Exists (dbPath);
   db = new SQLiteConnection (dbPath);

   if (!exist) {
	//Crea la tabla en base al modelo si es la primera vez
	db.CreateTable<Customer> ();
   }
}

Ahora crearemos el metodo LoadList. La implementación de este metodo no podria ser más fácil, por medio del metodo Table<T>() obtenemos todos los registros almacenados en la tabla de clientes (Customers), recorremos el resultado que nos arroja y los almacenamos en un ArrayList. Por medio de un ArrayAdapter colocamos los datos de los registros en el ListView.

//Para mostrar en la lista los registros ya almacenados
private void LoadList()
{
  var query= db.Table<Customer> ();

  ArrayList lst = new ArrayList ();
  foreach (var customer in query) {
     lst.Add (customer.Name);
  }

  string[] arr = (String[]) lst.ToArray(typeof(string));
  ArrayAdapter<String> adapter =
			new ArrayAdapter<String> (this, Android.Resource.Layout.SimpleListItem1,arr);
					
  lstCustomer.Adapter = adapter;
}

Y ya por último en el metodo OnCreate colocamos el siguiente código:

protected override void OnCreate (Bundle bundle)
{
   base.OnCreate (bundle);
	
   SetContentView (Resource.Layout.Main);
   LoadConnection ();

   Button btnAddCustomer = FindViewById<Button> (Resource.Id.btnAddCustomer);
   txtName = FindViewById<EditText> (Resource.Id.txtName);
   txtAddress = FindViewById<EditText> (Resource.Id.txtAddress);
   lstCustomer = FindViewById<ListView> (Resource.Id.lstCustomers);


   LoadList ();

   btnAddCustomer.Click+= (sender, e) => {
	Customer customer = new Customer {Name = txtName.Text , Address = txtAddress.Text};

	//Registra en la base de datos
	db.Insert(customer);

	LoadList();
  };


}

Observa que el metodo LoadConnection y LoadList son utilizados inmediatamente para crear la conexión y desplegar los registros en el ListView. Pero hay algo más interesante, en el evento click del boton btnAddCustomer podemos observar que se crea una instancia de la clase Customer. A esta instancia le proporciona como valores de sus propiedades lo que están contenidos en los controles EditView. Para insertar un nuevo registro, solo es necesario pasar como parámetro la instancia del objeto Customer al metodo Insert del objeto db.

Pues si, así de simple. Gracias a la libreria SQLite.Net no hemos tenido que teclear ni una sola linea de código SQL. Sin embargo la potencia de SQLite.Net va mucho mas allá,en este ejemplo solo les hemos dado una pequeña probadita. En los siguientes posts seguiremos profundizando en este interesante y potente componente, disponible gratuitamente en la Xamarin Store.

Recuerden que el código fuente pueden descargarlo de GitHub desde este enlace

Muchas gracias por leernos.
Cualquier duda o comentario les dejo mi Twitter: https://twitter.com/HuGomezMx

Tags: , ,

Category: Android

About the Author ()

Comments (8)

Trackback URL | Comments RSS Feed

  1. Guille dice:

    Tengo una pregunta que igual es muy básica pero, una vez instalada la apk en el dispositivo, ¿Donde guarda los archivos donde se almacenan los datos?
    Estoy empezando con xamarin y esta duda sé que es absurda pero básica, así puedo tomar estos archivos modificados y mantener los datos ya introducidos si formateo el dispositivo por ejemplo.

    Gracias. Saludos!

    • Guille dice:

      Aclaro que me referia a android y que me referia a que si se pueden guardar de forma que no solo sean visibles por el usuario root

      • Hugo Gomez Arenas dice:

        Hola Guille.
        Los datos se almacenan en la siguiente ruta dependiendo del nombre del paquete de tu apk:

        /data/data/com.yourpackage.name/databases

        Esto lo puedes comprobar depurando el ejemplo anterior. Si es necesario tener root access para explorar desde DDMS ( Dalvik Debug Monitor Server). En el caso de apps propias, cuando me interesa generar un metodo de respaldos yo los migro a un archivo .json o de texto con formato json para que el proceso de exportar e importar sea mas sencillo.

  2. Luis Portillo dice:

    Hola, me parece fantástico tu explicación, ya lo desarrolle y funciono a la perfección, solo como puedo cargar una base de datos externa en este mismo ejemplo?

    • Hugo Gomez Arenas dice:

      Hola Luis. Para poder responderte, ¿podrías ser un poco mas especifico por favor?. Para saber si te refieres a un archivo de base de datos, acceder directamente a una base de datos localizada en un servidor o servicios web.

      Saludos.

    • Hugo Gomez Arenas dice:

      Te invito tambien a que te suscribas con el formulario que viene arriba. Saludos!

  3. Ivan dice:

    Hola, estoy comenzando con Xamarin y bases de datos. Tengo una duda, en la parte de (folder, &amp;amp;quot;bussines3.db&amp;amp;quot;);… Que es lo que va exactamente donde estan todos esos &? Igual mas abajo hay varios. Espero tu respuesta. Saludos!

    • Hugo Gomez Arenas dice:

      Hola Ivan. Muchas gracias por escribir. Los caracteres aparecian asi debido a un error en el plugin para colocar código en las entradas.
      Este detalle ya fue corregido por lo que ya lo podrás visualizar correctamente.

Leave a Reply