Xamarin.Forms Tutorial de banco de dados local
Antes de tentar realizar este tutorial, você deve ter concluído com sucesso:
- Crie seu primeiro Xamarin.Forms início rápido de aplicativo .
- Tutorial de StackLayout.
- Tutorial de Botão.
- Tutorial de Entrada.
- Tutorial de CollectionView.
Neste tutorial, você aprenderá a:
- Use o Gerenciador de Pacotes NuGet para adicionar SQLite.NET a um Xamarin.Forms projeto.
- Criar as classes de acesso a dados.
- Consumir as classes de acesso a dados.
Você usará o Visual Studio 2019 ou Visual Studio para Mac para criar um aplicativo simples que demonstra como armazenar dados em um banco de dados SQLite.NET local. Estas capturas de tela mostram o aplicativo final:
Adicionar SQLite.NET
Para concluir este tutorial, você precisará ter o Visual Studio 2019 (versão mais recente) com a carga de trabalho Desenvolvimento mobile com .NET instalada. Além disso, você precisará de um Mac emparelhado para compilar o aplicativo do tutorial no iOS. Para obter informações sobre como instalar a plataforma Xamarin, confira Instalando o Xamarin. Para obter informações sobre como conectar o Visual Studio 2019 a um host de build Mac, confira Emparelhar com o Mac para desenvolvimento no Xamarin.iOS.
Inicie o Visual Studio e crie um novo aplicativo em branco Xamarin.Forms chamado LocalDatabaseTutorial.
Importante
Os snippets de C# e XAML neste tutorial exigem que a solução seja denominada LocalDatabaseTutorial. Usar um nome diferente causará erros de build ao copiar o código deste tutorial para a solução.
Para obter mais informações sobre a biblioteca .NET Standard que é criada, consulte Anatomia de um Xamarin.Forms aplicativo no Aprofundamento do Xamarin.Forms Início Rápido.
Na Gerenciador de Soluções, selecione o projeto LocalDatabaseTutorial, clique com o botão direito do mouse e selecione Gerenciar pacotes NuGet...:
No Gerenciador de Pacotes NuGet, selecione a guia Procurar, pesquise pelo pacote NuGet sqlite-net-pcl, selecione-o e clique no botão Instalar para adicioná-lo ao projeto:
Observação
Há muitos pacotes NuGet com nomes semelhantes. O pacote correto tem estes atributos:
- Autores: SQLite-net
- Link do NuGet: sqlite-net-pcl
Apesar do nome do pacote, este pacote NuGet pode ser usado em projetos do .NET Standard.
Este pacote será usado para incorporar operações de banco de dados ao aplicativo.
Importante
O SQLite.NET é uma biblioteca de terceiros com suporte do repositório praeclarum/sqlite-net.
Compile a solução para garantir que não haja erros.
Criar classes de acesso a dados
Neste exercício, você adicionará classes de acesso a dados ao projeto LocalDatabaseTutorial, que será usado para persistir dados sobre pessoas no banco de dados.
No Gerenciador de Soluções, no projeto LocalDatabaseTutorial, adicione uma nova classe chamada
Person
ao projeto. Em seguida, em Person.cs, remova todo o código do modelo e substitua-o pelo código a seguir:using SQLite; namespace LocalDatabaseTutorial { public class Person { [PrimaryKey, AutoIncrement] public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } }
Esse código define uma classe
Person
que armazenará dados sobre cada pessoa no aplicativo. A propriedadeID
é marcada com os atributosPrimaryKey
eAutoIncrement
para garantir que cada instância dePerson
no banco de dados terá uma ID exclusiva fornecida pelo SQLite.NET.No Gerenciador de Soluções, no projeto LocalDatabaseTutorial, adicione uma nova classe chamada
Database
ao projeto. Em seguida, em Database.cs, remova todo o código do modelo e substitua-o pelo código a seguir:using System.Collections.Generic; using System.Threading.Tasks; using SQLite; namespace LocalDatabaseTutorial { public class Database { readonly SQLiteAsyncConnection _database; public Database(string dbPath) { _database = new SQLiteAsyncConnection(dbPath); _database.CreateTableAsync<Person>().Wait(); } public Task<List<Person>> GetPeopleAsync() { return _database.Table<Person>().ToListAsync(); } public Task<int> SavePersonAsync(Person person) { return _database.InsertAsync(person); } } }
Esta classe contém código para criar o banco de dados, ler dados dele e gravar dados nele. O código usa APIs SQLite.NET assíncronas que movem operações de banco de dados para threads de segundo plano. Além disso, o construtor
Database
usa o caminho para o arquivo de banco de dados como um argumento. Esse caminho será fornecido pela classeApp
no próximo exercício.No Gerenciador de Soluções, no projeto LocalDatabaseTutorial, expanda App.xaml e clique duas vezes em App.xaml.cs para abri-lo. Em seguida, em App.xaml.cs, remova todo o código de modelo e substitua-o pelo código a seguir:
using System; using System.IO; using Xamarin.Forms; namespace LocalDatabaseTutorial { public partial class App : Application { static Database database; public static Database Database { get { if (database == null) { database = new Database(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "people.db3")); } return database; } } public App() { InitializeComponent(); MainPage = new MainPage(); } protected override void OnStart() { // Handle when your app starts } protected override void OnSleep() { // Handle when your app sleeps } protected override void OnResume() { // Handle when your app resumes } } }
Esse código define uma propriedade
Database
que cria uma nova instância deDatabase
como um singleton. Um caminho de arquivo local e o nome de arquivo, que representa onde armazenar o banco de dados, são passados como o argumento para o construtor da classeDatabase
.Importante
A vantagem de expor o banco de dados como um singleton é que uma conexão de banco de dados individual criada é mantida aberta enquanto o aplicativo é executado, evitando, portanto, o trabalho de abrir e fechar o arquivo de banco de dados cada vez que uma operação de banco de dados é realizada.
Compile a solução para garantir que não haja erros.
Consumir classes de acesso a dados
Neste exercício, você criará uma interface do usuário para consumir as classes de acesso a dados criadas anteriormente.
No Gerenciador de Soluções, no projeto LocalDatabaseTutorial, clique duas vezes em MainPage.xaml para abri-lo. Em seguida, em MainPage.xaml, remova todo o código do modelo e substitua-o pelo código a seguir:
<?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="LocalDatabaseTutorial.MainPage"> <StackLayout Margin="20,35,20,20"> <Entry x:Name="nameEntry" Placeholder="Enter name" /> <Entry x:Name="ageEntry" Placeholder="Enter age" /> <Button Text="Add to Database" Clicked="OnButtonClicked" /> <CollectionView x:Name="collectionView"> <CollectionView.ItemTemplate> <DataTemplate> <StackLayout> <Label Text="{Binding Name}" FontSize="Medium" /> <Label Text="{Binding Age}" TextColor="Silver" FontSize="Small" /> </StackLayout> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> </StackLayout> </ContentPage>
Esse código define declarativamente a interface do usuário para a página, que consiste em duas instâncias
Entry
, umButton
e umaCollectionView
em umStackLayout
. CadaEntry
tem sua propriedade definidaPlaceholder
, que especifica o texto de espaço reservado mostrado antes da entrada do usuário. OButton
define seu eventoClicked
para um manipulador de eventos chamadoOnButtonClicked
que será criado na próxima etapa. ACollectionView
define sua propriedadeItemTemplate
como umDataTemplate
, que usa umStackLayout
e dois objetosLabel
para definir a aparência de cada linha naCollectionView
. Os objetosLabel
associam as propriedades delesText
às propriedadesName
eAge
de cada objetoPerson
, respectivamente.Além disso, as instâncias
Entry
eCollectionView
têm nomes especificados com o atributox:Name
. Isso permite que o arquivo code-behind acesse esses objetos usando os nomes atribuídos.No Gerenciador de Soluções, no projeto LocalDatabaseTutorial, expanda MainPage.xaml e clique duas vezes em MainPage.xaml.cs para abri-lo. Em seguida, em MainPage.xaml.cs, adicione a substituição
OnAppearing
e o manipulador de eventosOnButtonClicked
à classe:protected override async void OnAppearing() { base.OnAppearing(); collectionView.ItemsSource = await App.Database.GetPeopleAsync(); } async void OnButtonClicked(object sender, EventArgs e) { if (!string.IsNullOrWhiteSpace(nameEntry.Text) && !string.IsNullOrWhiteSpace(ageEntry.Text)) { await App.Database.SavePersonAsync(new Person { Name = nameEntry.Text, Age = int.Parse(ageEntry.Text) }); nameEntry.Text = ageEntry.Text = string.Empty; collectionView.ItemsSource = await App.Database.GetPeopleAsync(); } }
O método
OnAppearing
preencheCollectionView
com todos os dados armazenados no banco de dados. O métodoOnButtonClicked
, que é executado quando oButton
é tocado, salva os dados inseridos no banco de dados antes de limpar as instânciasEntry
e atualizar os dados naCollectionView
.Observação
A substituição do método
OnAppearing
é executada após aContentPage
ser apresentada, mas apenas antes de se tornar visível. Portanto, este é um bom lugar para definir o conteúdo das Xamarin.Forms exibições.Na barra de ferramentas do Visual Studio, pressione o botão Iniciar (o botão triangular que se parece com o botão Reproduzir) para iniciar o aplicativo dentro de seu simulador remoto de iOS ou do Android Emulator escolhido.
Insira vários itens de dados tocando em
Button
para cada item de dados. Isso salvará os dados no banco de dados e preencherá novamente aCollectionView
com todos os dados do banco de dados:Interrompa o aplicativo no Visual Studio.
Para obter mais informações sobre bancos de dados locais no Xamarin.Forms, consulte Xamarin.Forms Bancos de dados locais (guia)
Parabéns!
Parabéns por concluir este tutorial, no qual você aprendeu a:
- Use o Gerenciador de Pacotes NuGet para adicionar SQLite.NET a um Xamarin.Forms projeto.
- Criar as classes de acesso a dados.
- Consumir as classes de acesso a dados.
Próximas etapas
Para saber mais sobre os conceitos básicos da criação de aplicativos móveis com Xamarin.Formso , continue no tutorial de serviços da Web.
Links relacionados
Tem algum problema com essa seção? Se tiver, envie seus comentários para que possamos melhorar esta seção.