Exercício: Armazenar dados localmente com o SQLite
Neste exercício, você usa o SQLite para armazenar informações localmente com um aplicativo. No cenário de exemplo, você decidiu armazenar dados em cache para o aplicativo de rede social para melhorar a capacidade de resposta. Este exercício cria e usa um banco de dados SQLite local para armazenar informações sobre pessoas. Você salva o arquivo de banco de dados físico no armazenamento local.
Este módulo usa o SDK do .NET 8.0. Verifique se você tem o .NET 8.0 instalado executando o seguinte comando em seu terminal de comando preferencial:
dotnet --list-sdks
Uma saída semelhante ao seguinte exemplo aparece:
6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]
Verifique se uma versão que começa com 8
está listada. Se nenhum estiver listado ou o comando não for encontrado, instale o SDK do .NET 8.0 mais recente.
Abrir a solução inicial
Clone ou baixe o repositório do exercício.
Observação
É melhor clonar o conteúdo do exercício em um caminho de pasta curto, como C:\dev, para evitar que arquivos gerados por build excedam o comprimento máximo do caminho.
Use o Visual Studio para abrir a solução People.sln, que você encontrará em mslearn-dotnetmaui-store-local-data>People ou na pasta inicial no Visual Studio Code.
Observação
Não tente compilar a solução ainda. O código está incompleto e não será compilado até que você adicione os elementos ausentes posteriormente neste exercício.
Definir uma entidade SQLite
Clique com o botão direito do mouse no projeto People, selecione Adicionar e selecione Nova pasta para adicionar uma nova pasta ao projeto. Nomeie a nova pasta Modelos.
Clique com o botão direito do mouse na pasta Modelos, selecione Adicionar e selecione Classe. Verifique se Classe está selecionada na lista e nomeie a nova classe Person.cs. Selecione Adicionar.
Modifique a classe e marque-a como
public
:namespace People.Models { public class Person { } }
Adicione uma propriedade
int
chamadaId
à classePerson
.Adicione uma propriedade
string
chamadaName
. A classe deve ter esta aparência:namespace People.Models { public class Person { public int Id { get; set; } public string Name { get; set; } } }
Salve o arquivo Person.cs.
Adicionar a biblioteca SQLite
Clique com o botão direito do mouse no nó do projeto People no Gerenciador de Soluções no Visual Studio.
No menu de contexto exibido, clique em Gerenciar pacotes NuGet.
Pesquise e selecione sqlite-net-pcl e selecione Instalar.
Pesquise e selecione SQLitePCLRaw.bundle_green e, em seguida, selecione Instalar.
Se estiver usando o Visual Studio Code, abra o terminal e esses pacotes com os seguintes comandos:
dotnet add package sqlite-net-pcl
dotnet add package SQLitePCLRaw.bundle_green
Adicionar atributos do SQLite
No arquivo Person.cs, adicione uma diretiva
using
para o namespaceSQLite
ao arquivo da classePerson
. Essa diretiva permite que você use os atributos SQLite.using SQLite; namespace People.Models { public class Person ... }
Anote a classe
Person
com o atributo[Table]
e especifique o nome da tabela comopeople
.Especifique a propriedade
Id
como a chave primária. Anote-o com os atributos[PrimaryKey]
e[AutoIncrement]
.Adicione anotações à propriedade
Name
. Especifique seuMaxLength
como 250. Especifique que cada valor na coluna deve serUnique
.A classe concluída deverá ter esta aparência:
using SQLite; namespace People.Models { [Table("people")] public class Person { [PrimaryKey, AutoIncrement] public int Id { get; set; } [MaxLength(250), Unique] public string Name { get; set; } } }
Salve o arquivo Person.cs.
Conectar-se ao banco de dados
Abra o arquivo PersonRepository.cs.
Examine a classe
PersonRepository
. Essa classe contém o esqueleto do código incompleto com marcadoresTODO
em que você adiciona a funcionalidade para acessar o banco de dados.Adicione uma diretiva
using
para os namespacesSQLite
ePeople.Models
ao arquivo para a classePersonRepository.cs
.Adicione um campo privado
SQLiteConnection
nomeadoconn
à classe, acima da funçãoInit
.Na função
Init
, verifique seconn
não é igual anull
. Nesse caso, retorne imediatamente.if (conn != null) return;
Dessa forma, o código de inicialização do banco de dados SQLite é executado apenas uma vez.
Inicialize o campo
conn
para se conectar ao banco de dados usando a variável_dbPath
.Use o método
conn.CreateTable
para criar uma tabela para armazenar dadosPerson
. A funçãoInit
concluída deve ter esta aparência:using SQLite; using People.Models; ... private SQLiteConnection conn; ... private void Init() { if (conn != null) return; conn = new SQLiteConnection(_dbPath); conn.CreateTable<Person>(); }
Inserir uma linha no banco de dados
Na classe
PersonRepository
, localize o métodoAddNewPerson
.Para inserir um novo objeto
Person
, substitua o comentárioTODO
neste método pelo código. O código primeiro chamaInit
para verificar se o banco de dados é inicializado e, em seguida, usa o métodoSQLiteConnection
do objetoInsert
. Defina a variávelresult
como o valor que o métodoInsert
retorna, conforme mostrado no seguinte código:public void AddNewPerson(string name) { int result = 0; try { // enter this line Init(); // basic validation to ensure a name was entered if (string.IsNullOrEmpty(name)) throw new Exception("Valid name required"); // enter this line result = conn.Insert(new Person { Name = name }); ... } ... }
Recuperar linhas do banco de dados
Na classe
PersonRepository
localize o métodoGetAllPeople
.Chame
Init
para verificar se o banco de dados está inicializado.Use o método genérico
Table\<T>
para recuperar todas as linhas na tabela. EspecifiquePerson
como o parâmetro de tipo.Use o método de extensão
ToList()
para transformar o resultado em uma coleçãoList\<Person>
e retornar essa coleção.Adicione o tratamento de erro encapsulando seu código em um bloco
try-catch
. Se houver um erro, defina a propriedadeStatusMessage
como a propriedadeMessage
da exceção e retorne uma coleção vazia. O método completo deverá ter esta aparência:public List<Person> GetAllPeople() { try { Init(); return conn.Table<Person>().ToList(); } catch (Exception ex) { StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message); } return new List<Person>(); }
Salve o arquivo PersonRepository.cs.
Integrar o repositório à interface do usuário
Abra o arquivo MauiProgram.cs.
Na função
CreateMauiApp
, após as instruções que adicionam a páginaMainPage
como um serviço singleton ao aplicativo, adicione código para executar as seguintes tarefas:Crie uma variável de cadeia de caracteres chamada
dbPath
. Inicialize essa cadeia de caracteres com a expressãoFileAccessHelper.GetLocalFilePath("people.db3")
. O arquivo de banco de dados usado pelo aplicativo é chamado people.db3, e o aplicativo salva esse arquivo no armazenamento local no dispositivo.Use a injeção de dependência para adicionar a classe
PersonRepository
como um serviço singleton ao aplicativo. A classePersonRepository
expõe um construtor que usa o caminho para o arquivo de banco de dados como um parâmetro de cadeia de caracteres.
O código concluído para a função
CreateMauiApp
deve ter esta aparência:public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); // Add this code string dbPath = FileAccessHelper.GetLocalFilePath("people.db3"); builder.Services.AddSingleton<PersonRepository>(s => ActivatorUtilities.CreateInstance<PersonRepository>(s, dbPath)); return builder.Build(); }
Salve o arquivo MauiProgram.cs.
Expanda App.xaml no Gerenciador de Soluções e abra o arquivo App.xaml.cs.
Adicione uma propriedade
public
,static
chamadaPersonRepo
. Essa propriedade contém um objetoPersonRepository
para a classeApp
.Inicialize a propriedade
PersonRepo
no construtor adicionando um parâmetroPersonRepository
ao construtor e definindo a propriedade "PersonRepo" como o valor neste parâmetro. A classeApp
concluída deve ter esta aparência:public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); MainPage = new AppShell(); PersonRepo = repo; } }
Observação
O processo de injeção de dependência preenche automaticamente o parâmetro repo
para o construtor.
Testar o aplicativo
Compile a solução, pressionando CTRL+SHIFT+B.
Depois que a compilação for concluída, inicie a depuração usando F5. Quando a interface do usuário for exibida, insira seu nome e selecione Adicionar Pessoa.
Selecione Obter Todas as Pessoas e verifique se seu nome aparece.
Experimente adicionando mais nomes e recuperando a lista de pessoas armazenadas.
Retorne ao Visual Studio ou ao Visual Studio Code e interrompa a depuração usando Shift+F5.
Reinicie o aplicativo e selecione Obter Todas as Pessoas. Verifique se os nomes armazenados anteriormente ainda estão armazenados no banco de dados. Feche o aplicativo quando terminar.