Armazene dados localmente com o SQLite
SQLite é útil quando você tem dados relacionais. Suponha que você esteja criando um aplicativo de mídia social. Você precisa armazenar informações sobre os assinantes do aplicativo. Esses dados incluem um ID exclusivo para cada usuário e seu nome. Você pode facilmente modelar esse tipo de relacionamento em um banco de dados SQLite.
Nesta unidade, você aprenderá a usar SQLite em um aplicativo .NET MAUI usando SQLite-net.
O que é SQLite?
O SQLite é um banco de dados local leve e multiplataforma que é um padrão do setor para aplicativos móveis. SQLite não requer um servidor. O banco de dados é armazenado em um único arquivo de disco no sistema de arquivos do dispositivo. Todas as operações de leitura e gravação são executadas diretamente no arquivo de disco SQLite.
As bibliotecas nativas do SQLite são incorporadas no Android e iOS por padrão; no entanto, o mecanismo suporta apenas uma API C/C++. Esse cenário não é ideal para desenvolvedores .NET, que querem alguma maneira de SQLite e .NET interagirem.
O que é SQLite-net?
Há vários wrappers C# em torno do mecanismo SQLite nativo que os desenvolvedores .NET podem usar. Muitos desenvolvedores .NET usam um wrapper C# popular chamado SQLite-net.
SQLite-net é um mapeador objeto-relacional. Ele ajuda a simplificar o processo de definição de esquemas de banco de dados, permitindo que você use os modelos definidos em seus projetos para servir como o esquema.
Como exemplo, considere a seguinte classe que modela um User
:
class User
{
public int Id { get; set; }
public string Username { get; set; }
...
}
Usando um mapeador objeto-relacional, você pode pegar essa classe inicial User
e criar uma tabela de banco de dados chamada User
que tenha colunas para os Id
campos e Username
nessa classe.
SQLite-net é fornecido como um pacote NuGet. Você deve adicionar o pacote sqlite-net-pcl aos seus aplicativos para usá-lo.
Como conectar-se a um banco de dados SQLite
Você pode estabelecer uma conexão com um banco de dados SQLite de um aplicativo por meio de um SQLiteConnection
objeto. Essa classe é definida no namespace, juntamente com os outros tipos e métodos que o SQLite
SQLite fornece. Quando você instanciar esse objeto, você passa o nome do arquivo para o arquivo de banco de dados. O construtor, em seguida, abre o arquivo se ele existe ou cria-lo se ele não está presente.
O código seguinte mostra um exemplo:
using SQLite;
...
string filename = ...
SQLiteConnection conn = new SQLiteConnection(filename);
Lembre-se de que filename
isso deve apontar para um local na área restrita do aplicativo.
Como criar uma tabela
Lembre-se de que SQLite-net é um mapeador objeto-relacional, o que significa que você pode criar seu esquema de banco de dados a partir de classes C#. SQLite-net pode criar uma tabela de banco de dados a partir de uma classe C# comum, mas há muitos atributos que você pode adicionar a uma classe para fornecer mais metadados. Esses metadados ajudam o SQLite a impor recursos como exclusividade e aplicar restrições aos seus dados.
Os atributos disponíveis incluem:
-
Table
: Especifique o nome da tabela se quiser que seja algo diferente do nome da classe. -
PrimaryKey
: Especifique que uma coluna é a chave primária. -
AutoIncrement
: Especifique que uma coluna deve aumentar automaticamente de valor quando uma nova linha é inserida. -
Column
: Especifique o nome de uma coluna se quiser que seja algo diferente do nome da propriedade. -
MaxLength
: Especifique o número máximo de caracteres que podem ser usados na coluna. -
Unique
: Especifique que o valor na coluna deve ser exclusivo de todas as outras linhas.
O código a seguir mostra uma versão atualizada da User
classe que aplica esses atributos:
[Table("user")]
public class User
{
// PrimaryKey is typically numeric
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[MaxLength(250), Unique]
public string Username { get; set; }
...
}
Depois de definir sua classe C#, chame o CreateTable
método genérico na SQLiteConnection
classe para gerar a tabela no banco de dados. Especifique a classe como o parâmetro type. Eis um exemplo:
SQLiteConnection conn = new SQLiteConnection(filename);
conn.CreateTable<User>();
Se a tabela já existir no banco de dados, o CreateTable
método verificará o esquema para ver se há alterações. Se houver, a operação tenta atualizar o esquema do banco de dados.
Como fazer operações básicas de leitura e gravação
Depois de criar uma tabela, você pode começar a interagir com ela. Para adicionar uma linha, use o Insert
SQLiteConnection
método na instância e forneça um objeto do tipo apropriado que contém os dados a serem inseridos. O código a seguir mostra como adicionar uma nova linha à User
tabela:
public int AddNewUser(User user)
{
int result = conn.Insert(user);
return result;
}
O Insert
método retorna um int
, que representa o número de linhas inseridas na tabela. Neste caso, esse número é um.
Para recuperar linhas de uma tabela, use o Table
método. Esse método retorna uma coleção de objetos (que podem estar vazios):
public List<User> GetAllUsers()
{
List<User> users = conn.Table<User>().ToList();
return users;
}
O método Table
devolve um objeto TableQuery\<T>
. Para obter um List
, use o ToList
método como mostrado no exemplo anterior.
Executar uma consulta SQLite usando LINQ
O Table
método recupera todas as linhas de uma tabela. Na maioria das vezes, você deseja retornar apenas um subconjunto das linhas que correspondem a um conjunto de critérios especificados. Para essas tarefas, use LINQ com SQLite-net.
SQLite-net suporta muitas consultas LINQ comuns, incluindo:
Where
Take
Skip
OrderBy
OrderByDescending
ThenBy
ElementAt
First
FirstOrDefault
ThenByDescending
Count
Com esses métodos, você pode usar a sintaxe do método de extensão ou a sintaxe do LINQ C#. Por exemplo, aqui está um trecho de código que permite recuperar os detalhes de um usuário especificado:
public User GetByUsername(string username)
{
var user = from u in conn.Table<User>()
where u.Username == username
select u;
return user.FirstOrDefault();
}
Atualizar e excluir linhas
Você atualiza uma linha usando o SQLiteConnection
método do Update
objeto. Você fornece um objeto que define a linha a ser atualizada com seus novos valores. O Update
método modifica a linha que tem o mesmo valor de chave primária que o objeto fornecido. O valor retornado é o número de linhas alteradas. Se esse valor for zero, nenhuma linha com uma chave primária correspondente foi encontrada e nada foi atualizado. O próximo trecho mostra esse método em ação:
public int UpdateUser(User user)
{
int result = 0;
result = conn.Update(user);
return result;
}
Remova linhas de uma tabela com o SQLiteConnection
método do Delete
objeto. A forma mais simples desse método usa a chave primária do item a ser excluído como parâmetro, conforme mostrado no exemplo a seguir. Esta forma do método é genérica e requer um parâmetro type Delete
. O valor retornado é o número de linhas removidas da tabela:
public int DeleteUser(int userID)
{
int result = 0;
result = conn.Delete<User>(userID);
return result;
}