Armazenar dados em um banco de dados SQLite.NET local
Neste guia de início rápido, você aprenderá a:
- Armazene dados localmente em um banco de dados SQLite.NET.
O guia de início rápido explica como armazenar dados em um banco de dados SQLite.NET local, de um Xamarin.Forms aplicativo Shell. O aplicativo final é mostrado abaixo:
Pré-requisitos
Você deve concluir com êxito o início rápido anterior antes de tentar este guia de início rápido.
Atualizar um aplicativo com o Visual Studio
Inicie o Visual Studio e abra a solução Notes.
No Gerenciador de Soluções, clique com o botão direito do mouse na solução do Notes e selecione Gerenciar Pacotes NuGet para Solução...:
No Gerenciador de Pacotes NuGet, selecione a guia Procurar e pesquise o pacote NuGet sqlite-net-pcl.
Aviso
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.
No Gerenciador de Pacotes NuGet, selecione o pacote sqlite-net-pcl correto, marque a caixa de seleção Projeto e clique no botão Instalar para adicioná-lo à solução:
Esse pacote será usado para incorporar operações de banco de dados ao aplicativo e será adicionado a todos os projetos da solução.
Importante
O SQLite.NET é uma biblioteca de terceiros com suporte do repositório praeclarum/sqlite-net.
Feche o Gerenciador de Pacotes NuGet.
No Gerenciador de Soluções, no projeto Notes, abra Note.cs na pasta Modelos e substitua o código existente pelo código a seguir:
using System; using SQLite; namespace Notes.Models { public class Note { [PrimaryKey, AutoIncrement] public int ID { get; set; } public string Text { get; set; } public DateTime Date { get; set; } } }
Essa classe define um modelo de
Note
que armazenará dados sobre cada observação no aplicativo. A propriedadeID
é marcada com os atributosPrimaryKey
eAutoIncrement
para garantir que cada instância deNote
no banco de dados SQLite.NET terá uma ID exclusiva fornecida pelo SQLite.NET.Salve as alterações no Note.cs pressionando CTRL+S.
Aviso
No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.
No Gerenciador de Soluções, adicione uma nova pasta chamada Data ao projeto Notes.
No Gerenciador de Soluções, no projeto Notes, adicione uma nova classe chamada NoteDatabase à pasta Data.
Em NoteDatabase.cs, substitua o código existente pelo código a seguir:
using System.Collections.Generic; using System.Threading.Tasks; using SQLite; using Notes.Models; namespace Notes.Data { public class NoteDatabase { readonly SQLiteAsyncConnection database; public NoteDatabase(string dbPath) { database = new SQLiteAsyncConnection(dbPath); database.CreateTableAsync<Note>().Wait(); } public Task<List<Note>> GetNotesAsync() { //Get all notes. return database.Table<Note>().ToListAsync(); } public Task<Note> GetNoteAsync(int id) { // Get a specific note. return database.Table<Note>() .Where(i => i.ID == id) .FirstOrDefaultAsync(); } public Task<int> SaveNoteAsync(Note note) { if (note.ID != 0) { // Update an existing note. return database.UpdateAsync(note); } else { // Save a new note. return database.InsertAsync(note); } } public Task<int> DeleteNoteAsync(Note note) { // Delete a note. return database.DeleteAsync(note); } } }
Esta classe contém código para criar o banco de dados e ler, gravar e excluir dados do banco de dados. 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
NoteDatabase
usa o caminho para o arquivo de banco de dados como um argumento. Esse caminho será fornecido pela classeApp
na próxima etapa.Salve as alterações no NoteDatabase.cs pressionando CTRL+S.
Aviso
No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.
No Gerenciador de Soluções, no projeto Anotações , expanda App.xaml e clique duas vezes em App.xaml.cs para abri-lo. Em seguida, substitua o código existente pelo código a seguir:
using System; using System.IO; using Notes.Data; using Xamarin.Forms; namespace Notes { public partial class App : Application { static NoteDatabase database; // Create the database connection as a singleton. public static NoteDatabase Database { get { if (database == null) { database = new NoteDatabase(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Notes.db3")); } return database; } } public App() { InitializeComponent(); MainPage = new AppShell(); } protected override void OnStart() { } protected override void OnSleep() { } protected override void OnResume() { } } }
Esse código define uma propriedade
Database
que cria uma nova instância deNoteDatabase
como um singleton, passando o nome de arquivo do banco de dados como o argumento para o construtorNoteDatabase
. 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.Salve as alterações em App.xaml.cs pressionando CTRL+S.
Aviso
No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.
No Gerenciador de Soluções, no projeto Anotações , expanda NotesPage.xaml na pasta Exibições e abra NotesPage.xaml.cs. Em seguida, substitua os métodos
OnAppearing
eOnSelectionChanged
pelo código a seguir:protected override async void OnAppearing() { base.OnAppearing(); // Retrieve all the notes from the database, and set them as the // data source for the CollectionView. collectionView.ItemsSource = await App.Database.GetNotesAsync(); } async void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.CurrentSelection != null) { // Navigate to the NoteEntryPage, passing the ID as a query parameter. Note note = (Note)e.CurrentSelection.FirstOrDefault(); await Shell.Current.GoToAsync($"{nameof(NoteEntryPage)}?{nameof(NoteEntryPage.ItemId)}={note.ID.ToString()}"); } }
O
OnAppearing
método preenche oCollectionView
com todas as notas armazenadas no banco de dados. OOnSelectionChanged
método navega até oNoteEntryPage
, passando aID
propriedade do objeto selecionadoNote
como um parâmetro de consulta.Salve as alterações no NotesPage.xaml.cs pressionando CTRL+S.
Aviso
No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.
No Gerenciador de Soluções, expanda NoteEntryPage.xaml na pasta Exibições e abra NoteEntryPage.xaml.cs. Em seguida, substitua os
LoadNote
métodos ,OnSaveButtonClicked
e peloOnDeleteButtonClicked
seguinte código:async void LoadNote(string itemId) { try { int id = Convert.ToInt32(itemId); // Retrieve the note and set it as the BindingContext of the page. Note note = await App.Database.GetNoteAsync(id); BindingContext = note; } catch (Exception) { Console.WriteLine("Failed to load note."); } } async void OnSaveButtonClicked(object sender, EventArgs e) { var note = (Note)BindingContext; note.Date = DateTime.UtcNow; if (!string.IsNullOrWhiteSpace(note.Text)) { await App.Database.SaveNoteAsync(note); } // Navigate backwards await Shell.Current.GoToAsync(".."); } async void OnDeleteButtonClicked(object sender, EventArgs e) { var note = (Note)BindingContext; await App.Database.DeleteNoteAsync(note); // Navigate backwards await Shell.Current.GoToAsync(".."); }
O
NoteEntryPage
usa oLoadNote
método para recuperar a nota do banco de dados, cujo ID foi passado como um parâmetro de consulta para a página, e armazená-la como umNote
objeto noBindingContext
da página. Quando o manipulador de eventosOnSaveButtonClicked
é executado, a instância deNote
é salva no banco de dados e o aplicativo navega de volta para a página anterior. Quando o manipulador de eventosOnDeleteButtonClicked
é executado, a instância deNote
é excluída do banco de dados e o aplicativo navega de volta para a página anterior.Salve as alterações no NoteEntryPage.xaml.cs pressionando CTRL+S.
Compile e execute o projeto em cada plataforma. Para obter mais informações, confira Como criar o guia de início rápido.
Na Página de Notas, pressione o botão Adicionar para navegar até a Página de Entrada de Notas e insira uma nota. Depois de salvar a observação, o aplicativo navegará de volta para a NotesPage.
Insira várias notas, de comprimento variável, para observar o comportamento do aplicativo. Feche o aplicativo e reinicie-o para garantir que as notas inseridas foram salvas no banco de dados.
Atualizar um aplicativo com o Visual Studio para Mac
Inicie o Visual Studio para Mac e abra a solução Notes.
No Painel de Soluções, clique com o botão direito do mouse na solução do Notes e selecione Gerenciar Pacotes NuGet...:
Na caixa de diálogo Gerenciar Pacotes NuGet, selecione a guia Procurar e pesquise o pacote NuGet sqlite-net-pcl.
Aviso
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.
Na caixa de diálogo Gerenciar Pacotes NuGet, selecione o pacote sqlite-net-pcl e clique no botão Adicionar Pacote para adicioná-lo à solução:
Este pacote será usado para incorporar operações de banco de dados ao aplicativo.
Na caixa de diálogo Selecionar projetos, certifique-se de que todas as caixas de seleção estejam marcadas e pressione o botão Ok:
Isso adicionará o pacote NuGet a todos os projetos na solução.
No Painel de Soluções, no projeto Notes, abra Note.cs na pasta Modelos e substitua o código existente pelo código a seguir:
using System; using SQLite; namespace Notes.Models { public class Note { [PrimaryKey, AutoIncrement] public int ID { get; set; } public string Text { get; set; } public DateTime Date { get; set; } } }
Essa classe define um modelo de
Note
que armazenará dados sobre cada observação no aplicativo. A propriedadeID
é marcada com os atributosPrimaryKey
eAutoIncrement
para garantir que cada instância deNote
no banco de dados SQLite.NET terá uma ID exclusiva fornecida pelo SQLite.NET.Salve as alterações no Note.cs escolhendo Salvar arquivo (ou pressionando ⌘ + S). >
Aviso
No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.
No Painel de Soluções, adicione uma nova pasta chamada Data ao projeto Notes.
No Painel de Soluções, no projeto Notes, adicione uma nova classe chamada NoteDatabase à pasta Data.
Em NoteDatabase.cs, substitua o código existente pelo código a seguir:
using System.Collections.Generic; using System.Threading.Tasks; using SQLite; using Notes.Models; namespace Notes.Data { public class NoteDatabase { readonly SQLiteAsyncConnection database; public NoteDatabase(string dbPath) { database = new SQLiteAsyncConnection(dbPath); database.CreateTableAsync<Note>().Wait(); } public Task<List<Note>> GetNotesAsync() { //Get all notes. return database.Table<Note>().ToListAsync(); } public Task<Note> GetNoteAsync(int id) { // Get a specific note. return database.Table<Note>() .Where(i => i.ID == id) .FirstOrDefaultAsync(); } public Task<int> SaveNoteAsync(Note note) { if (note.ID != 0) { // Update an existing note. return database.UpdateAsync(note); } else { // Save a new note. return database.InsertAsync(note); } } public Task<int> DeleteNoteAsync(Note note) { // Delete a note. return database.DeleteAsync(note); } } }
Esta classe contém código para criar o banco de dados e ler, gravar e excluir dados do banco de dados. 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
NoteDatabase
usa o caminho para o arquivo de banco de dados como um argumento. Esse caminho será fornecido pela classeApp
na próxima etapa.Salve as alterações em NoteDatabase.cs escolhendo Salvar arquivo (ou pressionando ⌘ + S). >
Aviso
No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.
No Painel de Soluções, no projeto Anotações, expanda App.xaml e clique duas vezes em App.xaml.cs para abri-lo. Em seguida, substitua o código existente pelo código a seguir:
using System; using System.IO; using Notes.Data; using Xamarin.Forms; namespace Notes { public partial class App : Application { static NoteDatabase database; // Create the database connection as a singleton. public static NoteDatabase Database { get { if (database == null) { database = new NoteDatabase(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Notes.db3")); } return database; } } public App() { InitializeComponent(); MainPage = new AppShell(); } protected override void OnStart() { } protected override void OnSleep() { } protected override void OnResume() { } } }
Esse código define uma propriedade
Database
que cria uma nova instância deNoteDatabase
como um singleton, passando o nome de arquivo do banco de dados como o argumento para o construtorNoteDatabase
. 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.Salve as alterações em App.xaml.cs escolhendo Salvar arquivo (ou pressionando ⌘ + S). >
Aviso
No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.
No Painel de Soluções, no projeto Anotações, expanda NotesPage.xaml na pasta Exibições e abra NotesPage.xaml.cs. Em seguida, substitua os métodos
OnAppearing
eOnSelectionChanged
pelo código a seguir:protected override async void OnAppearing() { base.OnAppearing(); // Retrieve all the notes from the database, and set them as the // data source for the CollectionView. collectionView.ItemsSource = await App.Database.GetNotesAsync(); } async void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.CurrentSelection != null) { // Navigate to the NoteEntryPage, passing the ID as a query parameter. Note note = (Note)e.CurrentSelection.FirstOrDefault(); await Shell.Current.GoToAsync($"{nameof(NoteEntryPage)}?{nameof(NoteEntryPage.ItemId)}={note.ID.ToString()}"); } }
O
OnAppearing
método preenche oCollectionView
com todas as notas armazenadas no banco de dados. OOnSelectionChanged
método navega até oNoteEntryPage
, passando aID
propriedade do objeto selecionadoNote
como um parâmetro de consulta.Salve as alterações em NotesPage.xaml.cs escolhendo Salvar arquivo (ou pressionando ⌘ + S). >
Aviso
No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.
No Painel de Soluções, expanda NoteEntryPage.xaml na pasta Exibições e abra NoteEntryPage.xaml.cs. Em seguida, substitua os
LoadNote
métodos ,OnSaveButtonClicked
e peloOnDeleteButtonClicked
seguinte código:async void LoadNote(string itemId) { try { int id = Convert.ToInt32(itemId); // Retrieve the note and set it as the BindingContext of the page. Note note = await App.Database.GetNoteAsync(id); BindingContext = note; } catch (Exception) { Console.WriteLine("Failed to load note."); } } async void OnSaveButtonClicked(object sender, EventArgs e) { var note = (Note)BindingContext; note.Date = DateTime.UtcNow; if (!string.IsNullOrWhiteSpace(note.Text)) { await App.Database.SaveNoteAsync(note); } // Navigate backwards await Shell.Current.GoToAsync(".."); } async void OnDeleteButtonClicked(object sender, EventArgs e) { var note = (Note)BindingContext; await App.Database.DeleteNoteAsync(note); // Navigate backwards await Shell.Current.GoToAsync(".."); }
O
NoteEntryPage
usa oLoadNote
método para recuperar a nota do banco de dados, cujo ID foi passado como um parâmetro de consulta para a página, e armazená-la como umNote
objeto noBindingContext
da página. Quando o manipulador de eventosOnSaveButtonClicked
é executado, a instância deNote
é salva no banco de dados e o aplicativo navega de volta para a página anterior. Quando o manipulador de eventosOnDeleteButtonClicked
é executado, a instância deNote
é excluída do banco de dados e o aplicativo navega de volta para a página anterior.Salve as alterações em NoteEntryPage.xaml.cs escolhendo Salvar arquivo (ou pressionando ⌘ + S). >
Compile e execute o projeto em cada plataforma. Para obter mais informações, confira Como criar o guia de início rápido.
Na Página de Notas, pressione o botão Adicionar para navegar até a Página de Entrada de Notas e insira uma nota. Depois de salvar a observação, o aplicativo navegará de volta para a NotesPage.
Insira várias notas, de comprimento variável, para observar o comportamento do aplicativo. Feche o aplicativo e reinicie-o para garantir que as notas inseridas foram salvas no banco de dados.
Próximas etapas
Neste guia de início rápido, você aprendeu a:
- Armazene dados localmente em um banco de dados SQLite.NET.
Continue para o próximo início rápido para estilizar o aplicativo com estilos XAML.