Xamarin Forms - CRUD no Firebase - II

 Neste artigo vamos concluir o CRUD básico usando o base de dados Firebase em uma aplicação Xamarin Forms.

Continuando a primeira parte do artigo vamos implementar os demais métodos para realizar o CRUD no Firebase.

Obtendo um contato, deletando e atualizando dados

Vamos agora concluir o código da classe FirebaseService incluindo os métodos :

  1. GetContato(int id)
  2. UpdateContato(int id, string nome, string email )
  3. DeleteContato(int id)
using Firebase.Database;
using Firebase.Database.Query;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using XF_CrudFirebase.Models;
namespace XF_CrudFirebase.Services
{
    public class FirebaseService
    {
        FirebaseClient firebase = 
            new FirebaseClient("https://xamarinfirestoreapp.firebaseio.com/");
        public async Task AddContato(int contatoId, string nome, string email)
        {
            await firebase
              .Child("Contatos")
                .PostAsync(new Contato()
                   { ContatoId = contatoId, Nome = nome, Email= email });
        }
        public async Task<List<Contato>> GetContatos()
        {
            return (await firebase
              .Child("Contatos")
              .OnceAsync<Contato>()).Select(item => new Contato
              {
                  Nome = item.Object.Nome,
                  Email = item.Object.Email,
                  ContatoId = item.Object.ContatoId
              }).ToList();
        }
        public async Task<Contato> GetContato(int ContatoId)
        {
            var contatos = await GetContatos();
            await firebase
              .Child("Contatos")
                .OnceAsync<Contato>();
            return contatos.Where(a => a.ContatoId == ContatoId)
                .FirstOrDefault();
        }
        public async Task UpdateContato(int ContatoId, string nome, string email)
        {
            var toUpdateContato = (await firebase
              .Child("Contatos")
                .OnceAsync<Contato>())
                   .Where(a => a.Object.ContatoId == ContatoId).FirstOrDefault();
            await firebase
              .Child("Contatos")
                .Child(toUpdateContato.Key)
                  .PutAsync(new Contato() 
                        { ContatoId = ContatoId, Nome = nome, Email= email });
        }
        public async Task DeleteContato(int ContatoId)
        {
            var toDeleteContato = (await firebase
              .Child("Contatos")
              .OnceAsync<Contato>())
                .Where(a => a.Object.ContatoId == ContatoId).FirstOrDefault();
            await firebase.Child("Contatos")
                    .Child(toDeleteContato.Key)
                        .DeleteAsync();
        }
    }
}

E no arquivo MainPage.xaml.cs vamos incluir o código para os eventos Click dos botões de comando:

using System;
using System.ComponentModel;
using System.Threading.Tasks;
using Xamarin.Forms;
using XF_CrudFirebase.Services;
namespace XF_CrudFirebase
{
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        FirebaseService fbService = new FirebaseService();
        public MainPage()
        {
            InitializeComponent();
        }
        protected async override void OnAppearing()
        {
            base.OnAppearing();
            await ExibeContatos();
        }
        private async void BtnIncluir_Clicked(object sender, System.EventArgs e)
        {
            await fbService.AddContato(Convert.ToInt32(txtId.Text), txtNome.Text, txtEmail.Text);
            txtId.Text = string.Empty;
            txtNome.Text = string.Empty;
            txtEmail.Text = string.Empty;
            await DisplayAlert("Success", "Contato incluído com sucesso", "OK");
            await ExibeContatos();
        }
        private async void BtnExibir_Clicked(object sender, System.EventArgs e)
        {
            var contato = await fbService.GetContato(Convert.ToInt32(txtId.Text));
            if (contato != null)
            {
                txtId.Text = contato.ContatoId.ToString();
                txtNome.Text = contato.Nome;
                txtEmail.Text = contato.Email;
            }
            else
            {
                await DisplayAlert("Success", "Não existe contato com esse ID", "OK");
            }
        }
        private async void BtnDeletar_Clicked(object sender, System.EventArgs e)
        {
            await fbService.DeleteContato(Convert.ToInt32(txtId.Text));
            txtId.Text = string.Empty;
            await DisplayAlert("Success", "Contato deletado com sucesso", "OK");
            await ExibeContatos();
        }
        private async void BtnAtualizar_Clicked(object sender, System.EventArgs e)
        {
            await fbService.UpdateContato(Convert.ToInt32(txtId.Text), txtNome.Text, txtEmail.Text);
            txtId.Text = string.Empty;
            txtNome.Text = string.Empty;
            txtEmail.Text = string.Empty;
            await DisplayAlert("Success", "Contato atualizado com sucesso", "OK");
            await ExibeContatos();
        }
        private async Task ExibeContatos()
        {
            var contatos = await fbService.GetContatos();
            listaContatos.ItemsSource = contatos;
        }
    }
}

Para otimizar o código criamos também o método ExibeContatos() que será chamada mais de um vez.

Executando o projeto e realizando as operações para obter contato, deletar e atualizar teremos o resultado a seguir:

Pegue o código do projeto compartilhado aqui:  XF_CrudFirebase.zip

Tu, pois, meu filho, fortifica-te na graça que há em Cristo Jesus.
2 Timóteo 2:1

Referências:


José Carlos Macoratti