[Ação do GitHub] [Relatório de cobertura de código]
Use um destes pacotes:
Versão | Pacote | Descrição |
---|---|---|
sqlite-net-pcl | Biblioteca padrão .NET | |
sqlite-net-sqlcipher | Com suporte para criptografia | |
sqlite-net-estático | Versão especial que usa P/Invokes para sqlite3 fornecido pela plataforma | |
sqlite-net-base | sem um pacote SQLitePCLRaw para que você possa escolher seu próprio provedor |
SQLite-net é uma biblioteca mínima de código aberto para permitir que aplicativos .NET, .NET Core e Mono armazenem dados em bancos de dados SQLite 3. Ele foi projetado inicialmente para funcionar com Xamarin.iOS, mas desde então cresceu para funcionar em todas as plataformas (Xamarin.*, .NET, UWP, Azure, etc.).
SQLite-net foi projetado como uma camada de banco de dados rápida e conveniente. Seu design segue estes objetivos :
Muito fácil de integrar com projetos existentes e roda em todas as plataformas .NET.
Wrapper fino sobre SQLite que é rápido e eficiente. (Essa biblioteca não deve ser o gargalo de desempenho de suas consultas.)
Métodos muito simples para executar operações e consultas CRUD com segurança (usando parâmetros) e para recuperar os resultados dessas consultas de maneira fortemente tipada.
Funciona com seu modelo de dados sem forçar você a alterar suas classes. (Contém uma pequena camada ORM orientada por reflexão.)
Instale sqlite-net-pcl do NuGet.
Importante: você precisará adicionar o pacote NuGet ao projeto da biblioteca .NET Standard e ao projeto do aplicativo dependente da plataforma .
SQLite-net está todo contido em um arquivo (eu sei, é legal, certo?) e é fácil de adicionar ao seu projeto. Basta adicionar SQLite.cs ao seu projeto e você estará pronto para começar a criar tabelas. Uma implementação assíncrona pode ser encontrada em SQLiteAsync.cs.
Este é um projeto de código aberto que aceita contribuições/sugestões/relatórios de bugs de quem o utiliza. Se você tiver alguma ideia sobre como melhorar a biblioteca, poste um problema aqui no GitHub. Confira Como Contribuir.
Por favor, consulte o Wiki para obter a documentação completa.
A biblioteca contém atributos simples que você pode usar para controlar a construção de tabelas. Em um programa de estoque simples, você pode usar:
public class Stock
{
[ PrimaryKey , AutoIncrement ]
public int Id { get ; set ; }
public string Symbol { get ; set ; }
}
public class Valuation
{
[ PrimaryKey , AutoIncrement ]
public int Id { get ; set ; }
[ Indexed ]
public int StockId { get ; set ; }
public DateTime Time { get ; set ; }
public decimal Price { get ; set ; }
[ Ignore ]
public string IgnoreField { get ; set ; }
}
Depois de definir os objetos em seu modelo, você poderá escolher entre APIs. Você pode usar a "API síncrona", onde as chamadas são bloqueadas uma de cada vez, ou pode usar a "API assíncrona", onde as chamadas não são bloqueadas. Você pode usar a API assíncrona para aplicativos móveis para aumentar a capacidade de resposta.
Ambas as APIs são explicadas nas duas seções abaixo.
Depois de definir sua entidade, você pode gerar tabelas automaticamente em seu banco de dados chamando CreateTable
:
// Get an absolute path to the database file
var databasePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) , " MyData.db " ) ;
var db = new SQLiteConnection ( databasePath ) ;
db . CreateTable < Stock > ( ) ;
db . CreateTable < Valuation > ( ) ;
Você pode inserir linhas no banco de dados usando Insert
. Se a tabela contiver uma chave primária incrementada automaticamente, o valor dessa chave estará disponível para você após a inserção:
public static void AddStock ( SQLiteConnection db , string symbol ) {
var stock = new Stock ( ) {
Symbol = symbol
} ;
db . Insert ( stock ) ;
Console . WriteLine ( " {0} == {1} " , stock . Symbol , stock . Id ) ;
}
Existem métodos semelhantes para Update
e Delete
.
A maneira mais direta de consultar dados é usando o método Table
. Isso pode levar predicados para restrição por meio de cláusulas WHERE e/ou adição de cláusulas ORDER BY:
var query = db . Table < Stock > ( ) . Where ( v => v . Symbol . StartsWith ( " A " ) ) ;
foreach ( var stock in query )
Console . WriteLine ( " Stock: " + stock . Symbol ) ;
Você também pode consultar o banco de dados em baixo nível usando o método Query
:
public static IEnumerable < Valuation > QueryValuations ( SQLiteConnection db , Stock stock ) {
return db . Query < Valuation > ( " select * from Valuation where StockId = ? " , stock . Id ) ;
}
O parâmetro genérico do método Query
especifica o tipo de objeto a ser criado para cada linha. Pode ser uma das classes da sua tabela ou qualquer outra classe cujas propriedades públicas correspondam à coluna retornada pela consulta. Por exemplo, poderíamos reescrever a consulta acima como:
public class Val
{
public decimal Money { get ; set ; }
public DateTime Date { get ; set ; }
}
public static IEnumerable < Val > QueryVals ( SQLiteConnection db , Stock stock ) {
return db . Query < Val > ( " select " Price " as " Money " , " Time " as " Date " from Valuation where StockId = ? " , stock . Id ) ;
}
Você pode realizar atualizações de baixo nível do banco de dados usando o método Execute
.
A biblioteca assíncrona usa a Biblioteca Paralela de Tarefas (TPL). Como tal, o uso normal de objetos Task
e as palavras-chave async
e await
funcionarão para você.
Depois de definir sua entidade, você poderá gerar tabelas automaticamente chamando CreateTableAsync
:
// Get an absolute path to the database file
var databasePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) , " MyData.db " ) ;
var db = new SQLiteAsyncConnection ( databasePath ) ;
await db . CreateTableAsync < Stock > ( ) ;
Console . WriteLine ( " Table created! " ) ;
Você pode inserir linhas no banco de dados usando Insert
. Se a tabela contiver uma chave primária incrementada automaticamente, o valor dessa chave estará disponível para você após a inserção:
var stock = new Stock ( )
{
Symbol = " AAPL "
} ;
await db . InsertAsync ( stock ) ;
Console . WriteLine ( " Auto stock id: {0} " , stock . Id ) ;
Existem métodos semelhantes para UpdateAsync
e DeleteAsync
.
A consulta de dados é feita de maneira mais direta usando o método Table
. Isso retornará uma instância AsyncTableQuery
, após o que você poderá adicionar predicados para restrição por meio de cláusulas WHERE e/ou adicionar ORDER BY. O banco de dados não é tocado fisicamente até que um dos métodos de recuperação especiais - ToListAsync
, FirstAsync
ou FirstOrDefaultAsync
- seja chamado.
var query = db . Table < Stock > ( ) . Where ( s => s . Symbol . StartsWith ( " A " ) ) ;
var result = await query . ToListAsync ( ) ;
foreach ( var s in result )
Console . WriteLine ( " Stock: " + s . Symbol ) ;
Existem vários métodos de baixo nível disponíveis. Você também pode consultar o banco de dados diretamente por meio do método QueryAsync
. Além das operações de alteração fornecidas por InsertAsync
etc., você pode emitir métodos ExecuteAsync
para alterar conjuntos de dados diretamente no banco de dados.
Outro método útil é ExecuteScalarAsync
. Isso permite que você retorne facilmente um valor escalar do banco de dados:
var count = await db . ExecuteScalarAsync < int > ( " select count(*) from Stock " ) ;
Console . WriteLine ( string . Format ( " Found '{0}' stock items. " , count ) ) ;
sqlite-net é normalmente usado como um ORM leve (mapeador objeto-relacional) usando os métodos CreateTable
e Table
. No entanto, você também pode usá-lo como uma maneira conveniente de executar consultas manualmente.
Aqui está um exemplo de criação de uma tabela, inserção nela (com um comando parametrizado) e consulta sem usar recursos ORM.
db . Execute ( " create table Stock(Symbol varchar(100) not null) " ) ;
db . Execute ( " insert into Stock(Symbol) values (?) " , " MSFT " ) ;
var stocks = db . Query < Stock > ( " select * from Stock " ) ;
Você pode usar um banco de dados criptografado usando o pacote sqlite-net-sqlcipher NuGet.
A chave do banco de dados é definida no SqliteConnectionString
passado para o construtor da conexão:
var options = new SQLiteConnectionString ( databasePath , true ,
key : " password " ) ;
var encryptedDb = new SQLiteAsyncConnection ( options ) ;
Se você precisar definir pragmas para controlar a criptografia, as ações poderão ser passadas para a string de conexão:
var options2 = new SQLiteConnectionString ( databasePath , true ,
key : " password " ,
preKeyAction : db => db . Execute ( " PRAGMA cipher_default_use_hmac = OFF; " ) ,
postKeyAction : db => db . Execute ( " PRAGMA kdf_iter = 128000; " ) ) ;
var encryptedDb2 = new SQLiteAsyncConnection ( options2 ) ;
Obrigado à comunidade .NET por abraçar este projeto e obrigado a todos os colaboradores que ajudaram a torná-lo excelente.
Obrigado também a Tirza van Dijk (@tirzavdijk) pelo excelente logotipo!