Armazene dados localmente com o SQLite

Concluído

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.

Diagrama mostrando como SQLite-net fornece um wrapper .NET e o mecanismo SQLite C/C++.

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 InsertSQLiteConnection 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 Tabledevolve 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;
}