Armazenar dados em um banco de dados SQLite.NET local

Baixar exemplo Baixar o exemplo

Neste guia de início rápido, você aprenderá a:

  • Armazene dados localmente em um banco de dados SQLite.NET.

O 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:

Página anotaçõespágina de anotações página

Pré-requisitos

Você deve concluir com êxito o início rápido anterior antes de tentar este guia de início rápido. Como alternativa, baixe o exemplo de início rápido anterior e use-o como o ponto de partida para este guia de início rápido.

Atualizar um aplicativo com o Visual Studio

  1. Inicie o Visual Studio e abra a solução Notes.

  2. Em Gerenciador de Soluções, clique com o botão direito do mouse na solução Anotações e selecione Gerenciar Pacotes NuGet para solução...:

    Gerenciar pacotes NuGet

  3. 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:

    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, marcar caixa de seleção Projeto e clique no botão Instalar para adicioná-lo à solução:

    Selecione sqlite-net-pcl

    Esse pacote será usado para incorporar operações de banco de dados ao aplicativo e será adicionado a todos os projetos na solução.

    Importante

    SQLite.NET é uma biblioteca de terceiros com suporte do repositório praeclarum/sqlite-net.

    Feche o Gerenciador de Pacotes NuGet.

  4. 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 propriedade ID é marcada com os atributos PrimaryKey e AutoIncrement para garantir que cada instância de Note no banco de dados SQLite.NET terá uma ID exclusiva fornecida pelo SQLite.NET.

    Salve as alterações em Note.cs pressionando CTRL+S.

    Aviso

    No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.

  5. No Gerenciador de Soluções, adicione uma nova pasta chamada Data ao projeto Notes.

  6. No Gerenciador de Soluções, no projeto Notes, adicione uma nova classe chamada NoteDatabase à pasta Data.

  7. 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 classe App na próxima etapa.

    Salve as alterações em NoteDatabase.cs pressionando CTRL+S.

    Aviso

    No momento, o aplicativo não será compilado devido a erros que serão corrigidos nas etapas subsequentes.

  8. Em 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 de NoteDatabase como um singleton, passando o nome de arquivo do banco de dados como o argumento para o construtor NoteDatabase. 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.

  9. Em Gerenciador de Soluções, no projeto Notes, expanda NotesPage.xaml na pasta Views e abra NotesPage.xaml.cs. Em seguida, substitua os métodos OnAppearing e OnSelectionChanged 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 o CollectionView com quaisquer anotações armazenadas no banco de dados. O OnSelectionChanged método navega para o NoteEntryPage, passando a ID propriedade do objeto selecionado Note como um parâmetro de consulta.

    Salve as alterações em 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.

  10. Em Gerenciador de Soluções, expanda NoteEntryPage.xaml na pasta Views e abra NoteEntryPage.xaml.cs. Em seguida, substitua os LoadNotemétodos , OnSaveButtonClickede OnDeleteButtonClicked pelo 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 o LoadNote método para recuperar a anotação do banco de dados, cuja ID foi passada como um parâmetro de consulta para a página e armazená-la como um Note objeto no BindingContext da página. Quando o manipulador de eventos OnSaveButtonClicked é executado, a instância de Note é salva no banco de dados e o aplicativo navega de volta para a página anterior. Quando o manipulador de eventos OnDeleteButtonClicked é executado, a instância de Note é 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 pressionando CTRL+S.

  11. Compile e execute o projeto em cada plataforma. Para obter mais informações, confira Como criar o guia de início rápido.

    No NotesPage , pressione o botão Adicionar para navegar até o NoteEntryPage e insira uma anotação. Depois de salvar a observação, o aplicativo navegará de volta para a NotesPage.

    Insira várias anotações, de comprimento variado, para observar o comportamento do aplicativo. Feche o aplicativo e inicie-o novamente para garantir que as anotações inseridas foram salvas no banco de dados.

Atualizar um aplicativo com o Visual Studio para Mac

  1. Inicie Visual Studio para Mac e abra a solução Anotações.

  2. No Painel de Soluções, clique com o botão direito do mouse na solução Anotações e selecione Gerenciar Pacotes NuGet...:

    Gerenciar pacotes NuGet

  3. 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:

    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:

    Selecione sqlite-net-pcl

    Este pacote será usado para incorporar operações de banco de dados ao aplicativo.

  4. Na caixa de diálogo Selecionar Projetos, verifique se todas as caixas de seleção estão marcadas e pressione o botão Ok :

    Adicionar pacote a todos os projetos

    Isso adicionará o pacote NuGet a cada projeto na solução.

  5. 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 propriedade ID é marcada com os atributos PrimaryKey e AutoIncrement para garantir que cada instância de Note no banco de dados SQLite.NET terá uma ID exclusiva fornecida pelo SQLite.NET.

    Salve as alterações em 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.

  6. No Painel de Soluções, adicione uma nova pasta chamada Data ao projeto Notes.

  7. No Painel de Soluções, no projeto Notes, adicione uma nova classe chamada NoteDatabase à pasta Data.

  8. 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 classe App 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.

  9. 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 de NoteDatabase como um singleton, passando o nome de arquivo do banco de dados como o argumento para o construtor NoteDatabase. 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.

  10. No Painel de Soluções, no projeto Anotações , expanda NotesPage.xaml na pasta Views e abra NotesPage.xaml.cs. Em seguida, substitua os métodos OnAppearing e OnSelectionChanged 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 o CollectionView com quaisquer anotações armazenadas no banco de dados. O OnSelectionChanged método navega até o NoteEntryPage, passando a ID propriedade do objeto selecionado Note 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.

  11. No Painel de Soluções, expanda NoteEntryPage.xaml na pasta Exibições e abra NoteEntryPage.xaml.cs. Em seguida, substitua os LoadNotemétodos , OnSaveButtonClickede OnDeleteButtonClicked pelo 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 o LoadNote método para recuperar a nota do banco de dados, cuja ID foi passada como um parâmetro de consulta para a página e armazená-la como um Note objeto na BindingContext página. Quando o manipulador de eventos OnSaveButtonClicked é executado, a instância de Note é salva no banco de dados e o aplicativo navega de volta para a página anterior. Quando o manipulador de eventos OnDeleteButtonClicked é executado, a instância de Note é 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).

  12. Compile e execute o projeto em cada plataforma. Para obter mais informações, confira Como criar o guia de início rápido.

    No NotesPage , pressione o botão Adicionar para navegar até o NoteEntryPage e insira uma nota. Depois de salvar a observação, o aplicativo navegará de volta para a NotesPage.

    Insira várias anotações, de comprimento variável, para observar o comportamento do aplicativo. Feche o aplicativo e inicie-o novamente para garantir que as anotações 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.

Prossiga para o próximo início rápido para estilizar o aplicativo com estilos XAML.