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 10.0. Verifique se você tem o .NET 10.0 instalado executando o seguinte comando em seu terminal de comando preferencial:
dotnet --list-sdks
Uma saída semelhante ao seguinte exemplo aparece:
9.0.100 [C:\Program Files\dotnet\sdk]
10.0.100 [C:\Program Files\dotnet\sdk]
Verifique se uma versão que começa com 10 está listada. Se nenhum estiver listado ou o comando não for encontrado, instale o SDK do .NET 10.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ê encontra em mslearn-dotnetmaui-store-local-data>People ou na pasta inicial no Visual Studio Code.
Observação
Não tente executar o aplicativo ainda, o código está incompleto e gerará exceções até que você adicione os elementos ausentes mais adiante neste exercício.
Definir uma entidade SQLite
Abra o arquivo Person.cs na pasta Modelos .
Adicione uma propriedade
intchamadaIdà classePerson.Adicione uma propriedade
stringchamadaName. A classe deverá ter a seguinte 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ó de projeto Pessoas do Gerenciador de Soluções no Visual Studio.
No menu de contexto exibido, selecione Gerenciar Pacotes NuGet.
Pesquise e selecione sqlite-net-pcl e 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
Adicionar atributos do SQLite
No arquivo Person.cs , adicione uma
usingdiretiva para oSQLitenamespace ao arquivo daPersonclasse. Essa diretiva permite que você use os atributos SQLite.using SQLite; namespace People.Models; public class Person { ... }Anote a classe
Personcom o atributo[Table]e especifique o nome da tabela comopeople.Especifique a propriedade
Idcomo a chave primária. Anote-o com os atributos[PrimaryKey]e[AutoIncrement].Adicione anotações à propriedade
Name. Especifique seuMaxLengthcomo 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 marcadoresTODOem que você adiciona a funcionalidade para acessar o banco de dados.Adicione uma diretiva
usingpara os namespacesSQLiteePeople.Modelsao arquivo para a classePersonRepository.cs.Adicione um campo privado
SQLiteConnectionnomeadoconnà classe, acima da funçãoInit.Na função
Init, verifique seconnnã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
connpara se conectar ao banco de dados usando a variável_dbPath.Use o método
conn.CreateTablepara criar uma tabela para armazenar dadosPerson. A funçãoInitconcluí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árioTODOneste método pelo código. O código primeiro chamaInitpara verificar se o banco de dados é inicializado e, em seguida, usa o métodoSQLiteConnectiondo objetoInsert. Defina a variávelresultcomo o valor que o métodoInsertretorna, 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
Initpara verificar se o banco de dados está inicializado.Use o método genérico
Table\<T>para recuperar todas as linhas na tabela. EspecifiquePersoncomo 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 propriedadeStatusMessagecomo a propriedadeMessageda 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áginaMainPagecomo 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
PersonRepositorycomo um serviço singleton ao aplicativo. A classePersonRepositoryexpõ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
CreateMauiAppdeve 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,staticchamadaPersonRepo. Essa propriedade contém um objetoPersonRepositorypara a classeApp.Inicialize a propriedade
PersonRepono construtor adicionando um parâmetroPersonRepositoryao construtor e definindo a propriedade "PersonRepo" como o valor neste parâmetro. A classeAppconcluída deve ter esta aparência:public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); PersonRepo = repo; } }
Observação
O processo de injeção de dependência preenche automaticamente o parâmetro repo para o construtor.
Testar o aplicativo
Crie a solução usando CTRL+Shift+B.
Depois que o build for concluído, 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.