Xamarin Forms - Usando o Realm Mobile Database localmente - II


Neste artigo vou mostrar 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#.

Continuando a primeira parte do artigo vamos implementar as funcionalidades que permitem alterar e excluir dados de um funcionário usando o Realm Mobile DataBase.

Recursos usados:

Implementando a edição e exclusão dos dados :  ExibeFunciPage

Vamos implementar a edição e exclusão dos dados de um funcionário selecionado.

Para isso primeiro vamos definir o código da página ExibeFunciPage.xaml conforme abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XF_RealmDB.Views.ExibeFunciPage"
             Title="Funcionário">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="10"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="10"/>
            </Grid.ColumnDefinitions>
            <Label Grid.Row ="0" Grid.Column="0" Grid.ColumnSpan="2" Text="Detalhes do Funcionário" />
            <Label Grid.Row ="1" Grid.Column="1" Text="Nome" />
            <Label Grid.Row="1" Grid.Column="2" Text ="{Binding Nome}" />
            <Label Grid.Row ="2" Grid.Column="1" Text="Cargo" />
            <Label Grid.Row="2" Grid.Column="2" Text ="{Binding Cargo}"/>
            <Label Grid.Row ="3" Grid.Column="1" Text="Setor" />
            <Label Grid.Row="3" Grid.Column="2" Text ="{Binding Setor}"/>
            <Label Grid.Row ="4" Grid.Column="1" Text="Qualificacao" />
            <Label Grid.Row="4" Grid.Column="2" Text ="{Binding Qualificacao}" />
            <Button Grid.Row ="5" Grid.Column="1" Text="Editar" Clicked="OnEditaClicked" />
            <Button Grid.Row="5" Grid.Column="2" Text="Deletar" Clicked="OnDeletaClicked" />
        </Grid>
</ContentPage>

Neste código estamos definindo a interface que vai exibir o funcionário selecionado no ListView da página MainPage e definimos dois eventos:

O código do arquivo ExibeFunciPage.xaml.cs é mostrado a seguir:

using Realms;
using System;
using System.Linq;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using XF_RealmDB.Model;
namespace XF_RealmDB.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ExibeFunciPage : ContentPage
    {
        Funcionario funciSelecionado;
        public ExibeFunciPage()
        {
            InitializeComponent();
        }
        public ExibeFunciPage(Funcionario _funcionario)
        {
            InitializeComponent();
            funciSelecionado = _funcionario;
            BindingContext = funciSelecionado;
        }
        private void OnEditaClicked(object sender, EventArgs e)
        {
            Navigation.PushAsync(new EditaFunciPage(funciSelecionado));
        }
        private async void OnDeletaClicked(object sender, EventArgs e)
        {
            bool resposta = await DisplayAlert("Confirma", "Tem Certeza ?", "Sim", "Não");
            if (resposta)
            {
                var RealmDb = Realm.GetInstance();
                var funci = RealmDb.All<Funcionario>().First(f => f.Id == funciSelecionado.Id);
                // Deleta um objeto com uma transação
                using (var trans = RealmDb.BeginWrite())
                {
                    RealmDb.Remove(funci);
                    trans.Commit();
                }
            }
            await Navigation.PopToRootAsync();
        }
    }
}

Neste código temos a implementação dos eventos Click dos botões Editar e Salvar.

No evento Click do botão Editar estamos passando o funcionário selecionado(funciSelecionado) para o construtor da página EditaFunciPage.

No evento Click do botão Deletar apresentamos uma mensagem de alerta solicitando a confirmação do usuário para a exclusão do registro e a seguir obtemos uma instância do banco de dados Realm e obtemos o funcionário selecionado do banco de dados pelo seu Id e usando uma transação usamos o método Remove() para excluir o registro do banco de dados.

Implementando a edição dos dados : EditaFunciPage

No arquivo EditaFunciPage.xaml inclua o código XAML abaixo para definir a interface do usuário para editar as informações do funcionário selecionado:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XF_RealmDB.Views.EditaFunciPage"
             Title="Editar Funcionário">
        <TableView Intent="Settings" BackgroundColor="White">
            <TableRoot>
                <TableSection Title="Editar">
                    <EntryCell x:Name="txtNome" Label="Nome" Text ="{Binding Nome}" Keyboard="Text" />
                    <EntryCell x:Name="txtCargo" Label="Cargo" Text ="{Binding Cargo}" Keyboard="Text" />
                    <EntryCell x:Name="txtSetor" Label="Setor" Text ="{Binding Setor}" Keyboard="Text" />
                    <EntryCell x:Name="txtQualificacao" Label="Qualificação" Text ="{Binding Qualificacao}" Keyboard="Text" />
                    <ViewCell>
                        <ContentView Padding="0,0">
                            <ContentView.Padding>
                                <OnPlatform x:TypeArguments="Thickness" iOS="10,0" WinPhone="0,15,0,0" />
                            </ContentView.Padding>
                            <ContentView.Content>
                                <Button BackgroundColor="#fd6d6d" Text="Alterar dados" TextColor="White" Clicked="btnOnSalvarClicked" />
                            </ContentView.Content>
                        </ContentView>
                    </ViewCell>
                </TableSection>
            </TableRoot>
        </TableView>
</ContentPage>

Neste código estamos exibindo os dados do funcionário selecionado usando o databindig e no botão Alterar dados definimos o evento btnOnSalvarClicked.

A seguir temos o código do arquivo EditaFunciPage.xaml.cs onde tratamos o evento Click do botão para salvar as alterações feitas no funcionário selecionado:

using Realms;
using System;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using XF_RealmDB.Model;
namespace XF_RealmDB.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class EditaFunciPage : ContentPage
    {
        private Funcionario funciSelecionado;
        public EditaFunciPage(Funcionario _funcionario)
        {
            InitializeComponent();
            this.funciSelecionado = _funcionario;
            BindingContext = funciSelecionado;
        }
        private void btnOnSalvarClicked(object sender, EventArgs e)
        {
            var RealmDb = Realm.GetInstance();
            using (var trans = RealmDb.BeginWrite())
            {
                funciSelecionado.Nome = txtNome.Text;
                funciSelecionado.Setor = txtSetor.Text;
                funciSelecionado.Cargo = txtCargo.Text;
                funciSelecionado.Qualificacao = txtQualificacao.Text;
                trans.Commit();
            }
            Navigation.PopToRootAsync();
        }
    }
}

Neste código o construtor da página recebe o funcionário selecionado e no evento Click do botão Alterar dados obtemos a instância do banco de dados Realm e usando o método BeginWrite() em uma transação persistimos os dados do funcionário informados pelo usuário.

Executando o projeto iremos obter o seguinte resultado:

Figura 1.0

Figura 2.0

Figura 3.0

Figura 4.0

Na figura 1.0 temos a página principal exibindo o funcionário no ListView vazio e o botão de comando. Vamos selecionar o funcionário clicando no listview.

Na figura 2.0 temos a exibição dos dados do funcionário e os botão para Editar e Deletar os seus dados. Vamos clicar em Editar.

Na figura 3.0 vemos os dados do funcionário sendo alterados. Ao final vamos clicar no botão Alterar Dados.

Na figura 4.0 vemos os dados alterados do funcionário que foram persistidos no banco de dados.

Clicando no botão Deletar teremos o seguinte resultado:

Ao confirmar os dados serão excluidos.

Vimos assim como simples a utilização do banco de dados Realm Mobile DataBase para uso local em aplicações Xamarin Forms.

Pegue o código do projeto aqui : XF_RealmDB.zip (sem as referências)

Sabendo, amados irmãos, que a vossa eleição é de Deus;Porque o nosso evangelho não foi a vós somente em palavras, mas também em poder, e no Espírito Santo, e em muita certeza, como bem sabeis quais fomos entre vós, por amor de vós.
1 Tessalonicenses 1:4,5

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:


José Carlos Macoratti