Neste artigo vvamos recordar como usar o banco de dados Realm para realizar a persistência de informações localmente em uma aplicação Xamarin Forms usando os no Visual Studio 2017 e a linguagem C#. |
Neste artigo vamos recordar como usar o Realm em uma aplicação Xamarin Forms que realiza um CRUD básico em uma entidade Cliente.
Para saber mais sobre como funciona o Realm acompanhe os artigos:
Quer bons motivos para usar o Realm ?
Ele é
rápido.
É multiplataforma.
Tem um forte suporte da comunidade.
É fácil de usar.
Recursos usados:
Visual Studio Community 2017 ou Xamarin Studio
Criando o projeto no Visual Studio 2017 Community e definindo a página principal
Abra o Visual Studio Community 2017 e clique em New Project;
Selecione Visual C#, o template Cross Plataform e a seguir Mogile App (Xamarin.Forms);
Informe o nome XF_RealmDB e clique no botão OK;
A seguir selecione Blank App e marque as opções - Plataform -> Android (iOS e Window UWP) e .NET Standard e clique em OK;
Nota: Como eu não tenho um Mac marquei somente o projeto Android.
Será criado um projeto contendo no projeto Portable as páginas App.xaml e MainPage.xaml.
No code-behind do arquivo App.xaml temos a classe App.cs que irá conter o código compartilhado e que vamos usar neste artigo.
Ao final teremos as referências incluídas em todos os projetos da nossa solução. Iremos usar a página MainPage.xaml como página principal da nossa aplicação.
Incluindo pacote Realm Mobile Database no projeto
Agora vamos incluir uma referência ao pacote do Realm Mobile DataBase via Nuget.
No menu Tools clique em Nuget Package Manager -> Manage Nuget Packages for Solution e selecione o pacote Realm:
Selecione todos os projetos e clique no botão Install. Além do pacote Realm, também serão instaladas as dependências Realm.DataBase e Realm.DataBinding.
Neste momento você vai precisar criar nos projetos criados um arquivo XML com o nome FodyWeavers.xml com o seguinte conteúdo:
<?xml version="1.0"
encoding="utf-8" ?> <Weavers> <RealmWeaver /> </Weavers> |
Nota: Fody é uma biblioteca extensível para tecer o conjunto .NET escrito por Simon Cropp. Ele adiciona a tarefa post build no pipeline de build do MS para manipular o IL gerado.
Ao final o projeto deverá ter a seguinte estrutura:
Definindo o modelo de domínio da aplicação : A classe Cliente e a classe Itens
Vamos criar uma aplicação para gerenciar informações de clientes, logo vamos definir uma classe chamada Cliente que será o nosso modelo de domínio.
Crie uma pasta Model no projeto (Project-> New Folder) e a seguir crie a classe Cliente.cs conforme mostra o código abaixo:
using Realms;
namespace XF_RealmDB.Model
{
public class Carro : RealmObject
{
public ClienteID { get; set; }
public string Nome { get; set; }
}
}
|
No código estamos usando o namespace : using Realms para que a classe possa herdar de RealmObject.
Os modelos de dados definindos usando o Realm usam classes C# tradicionais com propriedades. Basta herdar de RealmObject a classe base para criar os objetos do modelo de dados que podem ser persistido no Realm.
A principail restrição é que você só pode usar um objeto na thread na qual ele foi criado, ou seja, você não pode passar o objeto para outra thread.
Crie outra classe chamada Itens com o código abaixo:
public class Itens
{
public string Item { get; set; }
public int ClienteId { get; set; }
}
|
Usaremos esta classe para exibir as opções para Editar , Deletar e Cancelar vinculando-as ao Id do cliente selecionado.
Definindo o código a página principal : MainPage
Agora vamos definir o código XAML da página MainPage :
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:XF_RealmDB"
x:Class="XF_RealmDB.MainPage">
<AbsoluteLayout>
<ContentView AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0, 0, 1, 1">
<StackLayout>
<StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="StartAndExpand">
<Image Source="maco.jpg" WidthRequest="300"></Image>
<Entry x:Name="txtNome" Placeholder="Informe o Nome..."></Entry>
<Button Text="Incluir Cliente" WidthRequest="100" x:Name="btnAdicionar"
Clicked="btnAdicionar_Clicked"></Button>
<ListView x:Name="lvwCliente" ItemSelected="lvwCliente_ItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding Nome}"></Label>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
</ContentView>
<ContentView x:Name="popupEditaView" BackgroundColor="#C0808080" Padding="10, 0"
IsVisible="false" AbsoluteLayout.LayoutBounds="0, 0, 1, 1" AbsoluteLayout.LayoutFlags="All">
<StackLayout VerticalOptions="Center" HorizontalOptions="Center">
<StackLayout Orientation="Vertical" HeightRequest="200" WidthRequest="300"
BackgroundColor="White">
<Entry Margin="20,20,20,10" x:Name="txtEditaNome" Placeholder="Edita Nome"></Entry>
<Button Margin="20,0,20,0" Text="Edita" Clicked="btnEdita_Clicked"></Button>
<Button Margin="20,0,20,0" Text="Cancela" Clicked="btnCancela_Clicked"></Button>
</StackLayout>
</StackLayout>
</ContentView>
<ContentView x:Name="popupOpcaoView" BackgroundColor="#C0808080" Padding="10, 0"
IsVisible="false" AbsoluteLayout.LayoutBounds="0, 0, 1, 1" AbsoluteLayout.LayoutFlags="All">
<StackLayout VerticalOptions="Center" HorizontalOptions="Center">
<StackLayout Orientation="Vertical" HeightRequest="150" WidthRequest="150"
BackgroundColor="White">
<ListView x:Name="lvwOpcao" ItemSelected="lvwOpcao_ItemSelected" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label HorizontalTextAlignment="Center" VerticalTextAlignment="Center"
Text="{Binding Item}"></Label>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
</ContentView>
</AbsoluteLayout>
</ContentPage>
|
Neste código estamos usando o Leiaute AbsoluteLayout e definindo 3 ContentView:
Neste código estamos fazendo o databinding usando a propriedade : Nome , definida na classe Cliente. Também definimos o evento ItemSelected do ListView:
Estamos exibindo uma imagem no topo da página definida na primeira ContentView : <Image Source="maco.jpg" WidthRequest="300"></Image>
Assim você deve incluir a imagem que deseja exibir (maco.jpg) no projeto Android na pasta Resources/drawable.
Agora vamos definir o código do arquivo MainPage.xaml.cs é mostrado a seguir:
using Realms;
using System;
using System.Collections.Generic;
using System.Linq;
using Xamarin.Forms;
using XF_RealmDB.Model;
namespace XF_RealmDB
{
public partial class MainPage : ContentPage
{
List<Itens> ItemOpcao = new List<Itens>();
Cliente editaCliente;
public MainPage()
{
InitializeComponent();
var realmDB = Realm.GetInstance();
List<Cliente> listaCliente = realmDB.All<Cliente>().ToList();
lvwCliente.ItemsSource = listaCliente;
}
protected override void OnAppearing()
{
base.OnAppearing();
var realmDb = Realm.GetInstance();
}
private void btnAdicionar_Clicked(object sender, EventArgs e)
{
var realmDB = Realm.GetInstance();
var clientes = realmDB.All<Cliente>().ToList();
var maxClienteId = 0;
if (clientes.Count != 0)
{
maxClienteId = clientes.Max(c => c.ClienteID);
}
Cliente cliente = new Cliente()
{
ClienteID = maxClienteId + 1,
Nome = txtNome.Text,
};
realmDB.Write(() =>
{
realmDB.Add(cliente);
});
txtNome.Text = string.Empty;
List<Cliente> listaClientes = realmDB.All<Cliente>().ToList();
lvwCliente.ItemsSource = listaClientes;
}
private void lvwCliente_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
Cliente clienteSelecionado = lvwCliente.SelectedItem as Cliente;
if (clienteSelecionado != null)
{
ItemOpcao.Add(new Itens { Item = "Edita", ClienteId = clienteSelecionado.ClienteID });
ItemOpcao.Add(new Itens { Item = "Deleta", ClienteId = clienteSelecionado.ClienteID });
ItemOpcao.Add(new Itens { Item = "Cancela" });
lvwOpcao.ItemsSource = ItemOpcao;
popupOpcaoView.IsVisible = true;
}
}
private async void lvwOpcao_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var realmDB = Realm.GetInstance();
Itens selectedItem = lvwOpcao.SelectedItem as Itens;
if (selectedItem != null)
{
switch (selectedItem.Item)
{
case "Edita":
popupOpcaoView.IsVisible = false;
popupEditaView.IsVisible = true;
editaCliente = realmDB.All<Cliente>().First(b => b.ClienteID == selectedItem.ClienteId);
txtEditaNome.Text = editaCliente.Nome;
break;
case "Deleta":
var removeCliente = realmDB.All<Cliente>().First(b => b.ClienteID == selectedItem.ClienteId);
using (var db = realmDB.BeginWrite())
{
realmDB.Remove(removeCliente);
db.Commit();
}
await DisplayAlert("Sucesso", "Cliente Deletado", "OK");
popupOpcaoView.IsVisible = false;
List<Cliente> listaCliente = realmDB.All<Cliente>().ToList();
lvwCliente.ItemsSource = listaCliente;
break;
default:
popupOpcaoView.IsVisible = false;
break;
}
lvwOpcao.SelectedItem = null;
}
}
private async void btnEdita_Clicked(object sender, EventArgs e)
{
var realmDB = Realm.GetInstance();
var clienteSelecionado = realmDB.All<Cliente>().First(b => b.ClienteID == editaCliente.ClienteID);
using (var db = realmDB.BeginWrite())
{
editaCliente.Nome = txtEditaNome.Text;
db.Commit();
}
await DisplayAlert("Sucesso", "Cliente Atualizado", "OK");
txtEditaNome.Text = string.Empty;
popupEditaView.IsVisible = false;
}
private void btnCancela_Clicked(object sender, EventArgs e)
{
popupEditaView.IsVisible = false;
}
}
}
|
Neste código temos a implementação dos evento Clicked dos botões Edita e Incluir Cliente.
No evento do ListView estamos obtendo o cliente selecionado(selectedItem) para exibir ao usuário o seu nome e as opções para : Edita, Deleta ou Cancela.
Executando o projeto obteremos o seguinte resultado:
|
|
|
Iniciamos incluindo um novo cliente informando o nome e clicando no botão : Incluir Cliente
A seguir selecionamos o cliente e vemos o menu com as opções : Edita, Deleta e Cancela
Clicando em Edita temos o nome selecionado exibido para edição com as opções Edita e Cancela.
Alterando o nome e clicando em Edita temos a exibição do nome do cliente no ListView.
Pegue o código do projeto compartilhado aqui : XF_RealmDB.zip (projeto compartilhado)
"Não
pergunteis, pois, que haveis de comer, ou que haveis de beber, e não andeis
inquietos."
"Porque as nações do mundo buscam todas essas coisas; mas vosso Pai sabe que
precisais delas."
"Buscai antes o reino de Deus, e todas estas coisas vos serão acrescentadas."
Lucas 12:29-31
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Xamarim - Desenvolvimento Multiplataforma com C# ... - Macoratti.net
Xamarin.Forms - Olá Mundo - Criando sua primeira ... - Macoratti.net
Xamarin.Forms - Olá Mundo - Anatomia da aplicação - Macoratti.net
https://developer.xamarin.com/api/type/Android.App.AlertDialog/
https://developer.android.com/reference/android/app/Activity.html
https://developer.xamarin.com/api/type/Android.Widget.ProgressBar/