Xamarin – una aplicación para Android utilizando el sqlite.net.

El abrir una puerta nos descubre nuevas puertas” – M. Araujo

Con beneplácito doy un paso más en el desarrollo móvil con las rubustas (y pesadas) herramientas de desarrollo de Microsoft (Visual Studio) que cual “Kraken” extiende sus tentáculos al mundo de Linux, MacOs, Java, Google, etc.

Aun reciente la noticia de la conquista del mexicano Guillermo del Toro, recordándole al 45° presidente del vecino país del norte, en su propia casa, en su propia industria cinematográfica, en su propia cara, lo que la mayor parte del mundo sabe: los mexicanos no solo somos delincuentes, violadores, narcotraficantes y demás lacras sociales.

Atrás de Xamarin esta orgullosamente Miguel de Icaza, co-fundador de las antecesoras de la misma (Ximian y Mono), que en 2016 Microsoft adquiere. [1]

Como toda tecnología innovadora y vanguardiasta (al igual que el campo de las tecnologías de la información) tendrá algunos fallos al principio en lo que el producto obtiene un grado mayor de maduración, así que en algunas ocasiones puede uno abandonar la tarea de desarrollar en esta plataforma.

Lo único que en principio puedo recomendar es que se actualice todo lo actualizable de Microsoft Visual Studio (en mi caso 2015 y 2017), lea de diferentes fuentes y revise los proyectos de ejemplo que existen en la Web; esto es lo que me ha funcionado a mi, claro que esto nos pueda llevar horas y quizás días.

Mi tabla de salvación para hacer una aplicación móvil con acceso a base de datos (SQLite) vino del blog de Hugo Gomez Arenas “Xamurais Para el Desarrollador .NET”[2]

Había visto con anterioridad es post, pero me dio un poco de recelo pues parace que Hugo desarrolla con una Mac y me dije si en el sistema operativo del fabricante me ha dado algunos problemas… que será en MacOS, pero no, todo funciono bien con algunos detalles que solventé gracias a la experiencia que tengo en C#.

Por respeto a Hugo, haré un ejemplo diferente pero inspirado en su artículo y obvio con Windows 8.1, procesador AMD FX y Visual Studio 2015.

1. Creamos una nueva aplicación para Android en blanco (Opciones: Archivo – Nuevo – Proyecto), le llamaremos XappAn_Meetings (Xamarin Application Android).

2. Vamos a la carpeta de Referencias, para agregar el paquete Sqlite.Net

3. En algunas de las referencias se hablaba de que el autor debería de ser Paul Krueger, además se agregan 2 clases (que revisándolas caí en una conclusión que les comparto más adelante).

Estas clases son la “onda” – dirían los chicos -, y es una de las puertas donde hay que adentrarse (tecnología ORM). Hecho esto.

4. Vamos a agregar los controles a nuestra interfaz gráfica, el objetivo de la mini-aplicación es registrar las citas con algunas musas imaginarias. Aquí la parte de diseño; para ubicarla nos vamos a la carpeta Resources – layout, tenemos el archivo Main.xaml. En este archivo damos click derecho y elegimos la opción Ver en el diseñador.

Una de las cosas que me causo extrañeza ( y me sigue extrañando) es el mensaje que aparece abajo, en mi caso mi Android tiene la versión 5.1.1 (v22), y es lo que yo cambio para mi caso.

Para checar el código se hace click en la pestaña de la parte inferior etiquetada como Source.

5. Agregaremos los controles necesarios para desarrollar dicha aplicación, nombre de la musa, lugar de la cita, y fecha y hora.

El primer control sería lo que para otras aplicaciones se conoce como etiqueta (label), aquí se le nombra TextView y esta en la sección de Form Widgets. En la propiedad text asignamos “Name:”

Ahora vamos a agregar el control que capturará el valor (nombre) de nuestra cita, es importante señalar que si buscamos el control como EditText, no lo vamos a encontrar así en la barra de herramientas, sino como Plain Text. Aquí tenemos que darle un nombre al control para su posterior uso en la programación (txtName) después del prefijo @+id/.

Para probar accesamos un control que captura Time.

Agregamos un control que son un botón y una lista. En ocasiones es difícil encontrar los controles aquí la imagen de donde se localiza en la barra de herramientas el ListView.

Ahora si mostramos el código del Android Designer.

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>
<TextView
android:text=”Name:”
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=”Place:”
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/txtPlace” />
<TextView
android:text=”Date/Time:”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:id=”@+id/textView3″ />
<EditText
android:inputType=”time”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:id=”@+id/txtTime” />
<Button
android:text=”Add”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:id=”@+id/btAdd” />
<ListView
android:minWidth=”25px”
android:minHeight=”25px”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:id=”@+id/lstNames” />
</LinearLayout>

6. Ahora vamos a programar, la maravilla del ORM, para ello para empezar adentrarnos a otra puerta (patrón MVVM) por lo que vamos a crear una carpeta Models y ahí hacemos la clase Meetings. Que digamos son las columnas de nuestra tabla en nuestra futura base de datos, aquí el código.

using System;

using SQLite;

namespace XAppAn_Meetings.Models

{

public class Meetings

{

[PrimaryKey, AutoIncrement]

public int Id { set; get; }

public string Name { set; get; }

public string Place { set; get; }

public string Time { set; get; }

}

}

Lo que va anotado entre corchetes significa que el Id será nuestra llave primaria y es auto-incrementable.

7. Vamos ahora con la clase MainActivity, que en otros escenarios sería la forma principal (en el caso de aplicaciones de escritorio) o el index o default (en aplicaciones web). Para ahorrar tiempo escribo la clase completa.

using Android.App;

using Android.Widget;

using Android.OS;

using XAppAn_Meetings.Models;

using SQLite;

using System.IO;

using System.Collections;

using System;

namespace XAppAn_Meetings

{

[Activity(Label = “My Meetings”, MainLauncher = true)]

public class MainActivity : Activity

{

SQLiteConnection db;

EditText txtName;

EditText txtPlace;

EditText txtTime;

ListView lstNames;

Button btAdd;

private void LoadConnection()

{

string folder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);

string dbPath = System.IO.Path.Combine(folder, “meetings.db”);

bool exist = File.Exists(dbPath);

db = new SQLiteConnection(dbPath);

if (!exist)

{

db.CreateTable<Meetings>();

}

}

private void LoadList()

{

var query = db.Table<Meetings>();

ArrayList lst = new ArrayList();

foreach (var meeting in query)

{

lst.Add(meeting.Name);

}

string[] arr = (string[])lst.ToArray(typeof(string));

ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1,arr);

lstNames.Adapter = adapter;

}

protected override void OnCreate(Bundle bundle)

{

base.OnCreate(bundle);

// Set our view from the “main” layout resource

SetContentView(Resource.Layout.Main);

LoadConnection();

btAdd = FindViewById<Button>(Resource.Id.btAdd);

txtName = FindViewById<EditText>(Resource.Id.txtName);

txtTime = FindViewById<EditText>(Resource.Id.txtTime);

txtPlace = FindViewById<EditText>(Resource.Id.txtPlace);

lstNames = FindViewById<ListView>(Resource.Id.lstNames);

LoadList();

btAdd.Click += (sender, e) =>

{

Meetings myMeeting = new Meetings { Name = txtName.Text, Place = txtPlace.Text, Time = txtTime.Text };

db.Insert(myMeeting);

LoadList();

};

}

}

}

Primero como propiedades (atributos de la clase) vamos a poner un objeto de tipo conexión así como los controles de la actividad (los tres EditText, el Button y la ListView).

Luego creamos la conexión (método LoadConnection()) y la abrimos, de hecho si la base de datos no existe la creamos, y aquí empieza la magia no hay SQL, solo se envía un método de la conexión y la clase definida en el modelo.

En el método LoadList() la lista se carga con los nombres existentes de la base de datos.

Por último en el método OnCreate() se relacionan los controles de la clase con la vista, y se programa el método Click() del botón.

Una cosa que no entiendo y no si sea la arquitectura del equipo o un bug de VS o herramientas de terceros es la falla del emulador, tenía una teoría pero en clase se desplomó.

Por lo que la depuración la hice por medio de cable usb y directamente en mi poderoso Moto X Primera generación.

En resumen me ha agradado es la facilidad de el acceso a la base de datos, donde se ha agregado una capa que oculta la parte de SQL y la implementan las clases que se descargaron desde NuGet, ahora entiendo porque mis alumnos de ingeniería cuando les hablo de conexiones, comandos, readers, datables, etc pareciera que les hablo en chino, porque en estos tiempos pareciera que los programadores reducen su conocimiento a la lógica computacional y se despreocupan de la base de datos.

Al revisar el código que se descargó, he caido en la cuenta que yo tengo mis propio ORM aunque me queda la duda si no estaré re-inventando la rueda.

Casi cierro el cuatrimestre con inmensa alegría he dado pasos importantes y me he planteado futuros retos en mi labor docente.

Sobre la frase del principio me refiero a que he pasado la frontera del desarrollo movil donde abrí una puerta al empezar a desarrollar en dispositivos móviles pero ahora me encuentro con otras como ORMs, XAML, patrón MVVM, y otras puertas más, los retos (puertas) se multiplican.

Hasta la próxima entrega.

Atte.

Profesor Miguel Araujo.

Bibliografía.

[1] C. Petzold. Creating Mobile Apps with Xamarin.Forms. Redmon WA: Microsoft Press, 2016. p. 5.

[2] H.G. Arenas. Componente SQLite.Net en Xamarin Android (Parte II) [on-line].México: Xamurais Para el desarrollador .NET, 2014 Disponible en: http://xamurais.com/componente-sqlite-net-en-xamarin-android-parte-ii

Deja un comentario