viernes, 30 de octubre de 2015

Usando SQLite .NET multiplataforma en Xamarin Android, Xamarin IOS, Windows Phone y Windows Store (Parte 2 WS)

Al igual que en el caso de Windows Phone lo primero es crear un proyecto nuevo, enlazarlo con Project Linker y agregar la referencia a una extensión como se hizo en la primera parte de este tutorial, por este motivo no me detendré en algunos pasos que se repiten en esta segunda parte y me enfocare a lo especifico de Windows Store.
Primero generamos el proyecto nuevo
5CreandoWS

El siguiente paso sería enlazar el proyecto Core a este que acabamos de crear del mismo modo en que se hizo con Windows Phone
Después de realizado lo anterior hay que instalar la extensión “SQLite for Windows Runtime(Windows 8.1)” desde el administrador de extensiones de Visual Studio (Menú Herramientas/Actualizaciones y extensiones)
image
Finalmente agregamos la referencia a esta extensión en nuestro proyecto.
image
Un detalle importante es que se debe crear un paquete de nuestra aplicación por arquitectura (x86,x64 o ARM) por lo cual hay que quitar esta referencia y volverla a agregar cada que cambiemos la arquitectura de lo contrario obtendremos la excepción “An exception of type 'System.BadImageFormatException' occurred in SQL.WS.exe but was not handled in user code”.  Esta excepción se debe a que la extensión agrega los paquetes específicos de la arquitectura que este definida en el momento en que se agrega la referencia.
image

Utilizando SQLite en el proyecto de Windows Store

Como ya tenemos desarrollada nuestra clase para administrar nuestra base de datos local (CRUDManager) y en pasos anteriores ya enlazamos Core a este proyecto solo nos resta generar la funcionalidad especifica de la plataforma, la cual básicamente es la interfaz de usuario y las llamadas a las funciones de CRUDManager.
En este caso el código es muy similar al de Windows Phone al ambos usar XAML como lenguaje para generar la interfaz de usuario. Aprovechando el tamaño de la pantalla y no dedicándole mucho tiempo al diseño voy a poner toda la funcionalidad en una misma pantalla a diferencia de Windows Phone que estaba acomodada por dos pantallas.
image
<Page
    x:Class="SQL.WS.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:SQL.WS"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <StackPanel Orientation="Horizontal">
            <StackPanel Width="320">
                <TextBlock FontSize="40">Guadar contactos</TextBlock>
                <TextBlock FontSize="20" >Nombre</TextBlock>
                <TextBox x:Name="txtName"></TextBox>
                <TextBlock FontSize="20">Edad</TextBlock>
                <TextBox x:Name="txtAge"></TextBox>
                <TextBlock FontSize="20">Correo Electrónico</TextBlock>
                <TextBox x:Name="txtMail"></TextBox>
                <TextBlock FontSize="20">Teléfono</TextBlock>
                <TextBox x:Name="txtPhoneNumber"></TextBox>
                <Button x:Name="btnSave" Margin="0,0,-3,0" Width="323" Click="btnSave_Click">Guardar</Button>

            </StackPanel>
            <StackPanel Width="300" Margin="100 0 0 0">
                <TextBlock FontSize="40">Buscar contactos</TextBlock>
                <TextBlock FontSize="20">Nombre</TextBlock>
                <TextBox x:Name="txtSName"></TextBox>
                <Button x:Name="btnSearch" Click="btnSearch_Click" Margin="0,0,-3,0" Width="303">Buscar</Button>
                <Button x:Name="btnAllItems" Click="btnAllItems_Click" Width="303" Margin="0,0,-3,0">Mostrar Todos</Button>
                <ListBox x:Name="lbResults" Height="250">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock FontWeight="Bold">Nombre</TextBlock>
                                <TextBlock Text="{Binding Name}"></TextBlock>
                                <TextBlock FontWeight="Bold">Edad</TextBlock>
                                <TextBlock Text="{Binding Age}"></TextBlock>
                                <TextBlock FontWeight="Bold">Correo Electrónico</TextBlock>
                                <TextBlock Text="{Binding Mail}"></TextBlock>
                                <TextBlock FontWeight="Bold">Teléfono</TextBlock>
                                <TextBlock Text="{Binding PhoneNumber}"></TextBlock>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                <Button x:Name="btnDelete" Width="293" Click="btnDelete_Click">Eliminar seleccionado</Button>
            </StackPanel>
        </StackPanel>
    </Grid>
</Page>
Finalmente el código que da funcionalidad a esta interfaz es prácticamente el mismo que para WP
using SQL.Core.Core;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace SQL.WS
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            InitializateDB();
        }

        CRUDManager crud;
        void InitializateDB()
        {
            var sqliteFilename = "ContactsDb";
            var path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, sqliteFilename); ;

            crud = new CRUDManager(path);
        }

        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            Contact contact =
                new Contact(txtName.Text, int.Parse(txtAge.Text), txtPhoneNumber.Text, txtMail.Text);

            crud.SaveValue<Contact>(contact);
            lbResults.ItemsSource = crud.GetAllItems<Contact>();
        }

        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            //Buscamos el contacto que coincida con lo introducido por el usuario
            lbResults.ItemsSource = new List<Contact> { crud.GetItem<Contact>(txtName.Text) };
        }

        private void btnAllItems_Click(object sender, RoutedEventArgs e)
        {
            //Mostramos todos los registros
            lbResults.ItemsSource = crud.GetAllItems<Contact>();
        }



        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            //Eliminamos el contacto seleccionado
            crud.Delete<Contact>(((Contact)lbResults.SelectedItem).Key);
            lbResults.ItemsSource = null;
        }
    }
}

jueves, 15 de octubre de 2015

Usando SQLite .NET multiplataforma en Xamarin Android, Xamarin IOS, Windows Phone y Windows Store (Parte 1 WP)

En esta serie de publicaciones voy a mostrar cómo crear una aplicación multiplataforma que permita crear bases de datos locales SQLite usando SQLite.Net para las plataformas:
  • Windows Phone 8.1 (Parte 1)
  • Windows Store (Parte 2)
  • IOS y Android (Parte 3)
Para empezar Vamos a generar una solución en Visual Studio la cual contenga los 4 proyectos que se van a usar a lo largo de este tutorial. Para este ejemplo se va a compartir el código mediante un proyecto Core que va a ser enlazado a los diferentes proyectos de la aplicación, en un futuro escribiré una publicación para mostrar el uso de SQLite usando una Librería de clases portable.
  • Librería de clases de C# (SQL.Core)
  • Proyecto de Windows Phone (SQL.WP)
  • Proyecto de Windows Store (SQL.WS)
  • Proyecto de Xamarin Android (SQL.Droid)
  • Proyecto de Xamarin IOS (SQL.IOS)

Creando el proyecto Core

1CreandoCore