Olá pessoal! Tudo bem? Depois de termos aprendido a usar todas as operações SQL com o sqlite-net-pcl, vamos usar recursos do sqlite-net-pcl para realizar as mesmas ações sem precisar usar nenhuma instrução SQL. Ou seja, com o sqlite-net-pcl e PCLExt.Storage, vamos adicionar, remover, atualizar e ler informações sem escrever instruções SQL.
Como sempre, fique à vontade para baixar o código fonte deste artigo para estudos.
O segredo está no fato de que o sqlite-net-pcl permite representar uma tabela através de uma classe, e podemos adicionar atributos para configurar a chave primária. Neste caso, a classe Model representará uma tabela com dois campos: Id com o tipo int
e Info com o tipo string
. E o campo Id é chave primária (atributo PrimaryKey
) e auto incremental (atributo AutoIncrement
).
public class Model { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Info { get; set; } }
Na classe App
, fazemos basicamente o mesmo procedimento, usando o PCLExt.Storage para abrir ou criar o arquivo banco.db e o sqlite-net-pcl cria a tabela e abre a conexão. Só que desta vez usamos o método CreateTable
da Conexao (do tipo SQLiteConnection
) para criar uma tabela que armazene dados representados pela classe Model
(note que nem especificamos o nome da tabela).
public SQLiteConnection Conexao { get; set; } public App () { var pasta = new LocalRootFolder(); var arquivo = pasta.CreateFile("banco.db", CreationCollisionOption.OpenIfExists); Conexao = new SQLiteConnection(arquivo.Path); Conexao.CreateTable<Model>(); InitializeComponent(); MainPage = new MainPage(); }
A página principal do app propositalmente é a mesma do artigo anterior, e vamos fazer as quatro operações CRUD nos mesmos métodos. Da mesma forma como no artigo anterior, usaremos ações de contexto para atualizar e apagar dados individuais.
<StackLayout> <ListView x:Name="ListView"> <ListView.ItemTemplate> <DataTemplate> <TextCell Text="{Binding Info}"> <TextCell.ContextActions> <MenuItem Text="Atualizar" Clicked="MenuItemAtualizar_OnClicked" CommandParameter="{Binding .}" IsDestructive="False" /> <MenuItem Text="Apagar" Clicked="MenuItemApagar_OnClicked" CommandParameter="{Binding .}" IsDestructive="True" /> </TextCell.ContextActions> </TextCell> </DataTemplate> </ListView.ItemTemplate> </ListView> <Button Text="Adicionar" Clicked="ButtonAdicionar_OnClicked" /> <Button Text="Apagar tudo" Clicked="ButtonApagarTudo_OnClicked" /> </StackLayout>
No método ButtonAdicionar_OnClicked
, usamos o método Insert
para adicionar uma informação nova. Como estamos criamos um objeto Model
, o sqlite-net-pcl já sabe que ele será armazenado na tabela correspondente.
private void ButtonAdicionar_OnClicked(object sender, EventArgs e) { ((App) Application.Current).Conexao.Insert(new Model {Info = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.ffff}"}); CarregarInformacoes(); }
Já no método ButtonApagarTudo_OnClicked
, usamos a instrução DeleteAll
para apagar todos os objetos do tipo T
do banco, neste caso, Model
.
private void ButtonApagarTudo_OnClicked(object sender, EventArgs e) { ((App) Application.Current).Conexao.DeleteAll<Model>(); CarregarInformacoes(); }
O método CarregarInformacoes()
traz as informações do banco para a tela através do método Table
, onde T
neste caso é Model
(ou seja, trazemos todos os objetos Model
do banco para a memória). Logo depois, usamos o método ToList()
para converter as informações trazida numa lista, que pode facilmente ser configurada como ItemsSource
da ListView
.
public MainPage() { InitializeComponent(); CarregarInformacoes(); } private void CarregarInformacoes() { var list = ((App) Application.Current).Conexao.Table<Model>().ToList(); ListView.ItemsSource = list; }
No método MenuItemAtualizar_OnClicked
, resgatamos o objeto vindo da ListView
, mudamos a informação que queremos e repassamos o objeto atualizado para o banco através do método Update
. Todas as informações atualizadas em memória já serão persistidas no banco – desde que a informação que representa a chave primária seja igual, claro.
private void MenuItemAtualizar_OnClicked(object sender, EventArgs e) { var mi = (MenuItem)sender; var model = (Model)mi.CommandParameter; model.Info = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.ffff}"; ((App) Application.Current).Conexao.Update(model); CarregarInformacoes(); }
Finalmente em MenuItemApagar_OnClicked
, resgatamos o objeto da ListView
e passamos sua identificação para o método Delete
, onde T
é Model
. Ou seja, o Model
cuja identificação for passada como parâmetro será apagado do banco.
private void MenuItemApagar_OnClicked(object sender, EventArgs e) { var mi = (MenuItem)sender; var model = (Model)mi.CommandParameter; ((App) Application.Current).Conexao.Delete<Model>(model.Id); CarregarInformacoes(); }
E este é o resultado:


E sem nem usar instruções SQL, conseguimos fazer as operações básicas de bando de dados num banco local, com o uso inteligente do sqlite-net-pcl e do PCLExt.Storage. Até a próxima!
[]’s
Paulo Roberto