Share via


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, a partir de um Xamarin.Forms aplicativo do Shell. O aplicativo final é mostrado abaixo:

Página de ObservaçõesPágina de Entrada de Observação

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

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

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

    Gerenciar Pacotes do NuGet…

  3. No Gerenciador de Pacotes NuGet, selecione a guia Procurar e procure o pacote NuGet sqlite-net-pcl.

    Aviso

    Existem 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, marque a 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 no aplicativo e será adicionado a cada projeto na solução.

    Importante

    SQLite.NET é uma biblioteca de terceiros que é suportada pelo 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. No Gerenciador de Soluções, no projeto Notes , 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. No 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 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 pressionando CTRL+S.

    Aviso

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

  10. No Gerenciador de Soluções, expanda NoteEntryPage.xaml na pasta Modos de Exibição 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 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 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.

    Na NotesPage, pressione o botão Adicionar para navegar até a NoteEntryPage e inserir uma anotação. 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 anotações inseridas foram salvas no banco de dados.

Atualizar um aplicativo com o Visual Studio para Mac

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

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

    Gerenciar Pacotes do NuGet…

  3. Na caixa de diálogo Gerenciar Pacotes NuGet, selecione a guia Procurar e procure o pacote NuGet sqlite-net-pcl.

    Aviso

    Existem 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 no 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 Solution Pad, no projeto Notes, 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 Solution Pad, 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 até o NoteEntryPage, passando a ID propriedade do objeto selecionado Note como um parâmetro de consulta.

    Salve as alterações no 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 Solution Pad, 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 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.

    Na NotesPage, pressione o botão Adicionar para navegar até a NoteEntryPage e inserir uma anotação. 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 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.

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