[Acción de GitHub] [Informe de cobertura de código]
Utilice uno de estos paquetes:
Versión | Paquete | Descripción |
---|---|---|
sqlite-net-pcl | Biblioteca estándar .NET | |
sqlite-net-sqlcipher | Con soporte de cifrado | |
sqlite-net-estático | Versión especial que utiliza P/Invokes para sqlite3 proporcionado por la plataforma | |
base-net-sqlite | sin un paquete SQLitePCLRaw para que puedas elegir tu propio proveedor |
SQLite-net es una biblioteca mínima de código abierto que permite que las aplicaciones .NET, .NET Core y Mono almacenen datos en bases de datos SQLite 3. Primero se diseñó para funcionar con Xamarin.iOS, pero desde entonces ha crecido para funcionar en todas las plataformas (Xamarin.*, .NET, UWP, Azure, etc.).
SQLite-net fue diseñado como una capa de base de datos rápida y conveniente. Su diseño se deriva de estos objetivos :
Muy fácil de integrar con proyectos existentes y se ejecuta en todas las plataformas .NET.
Envoltura delgada sobre SQLite que es rápida y eficiente. (Esta biblioteca no debería ser el cuello de botella en el rendimiento de sus consultas).
Métodos muy simples para ejecutar consultas y operaciones CRUD de forma segura (usando parámetros) y para recuperar los resultados de esas consultas de forma inflexible.
Trabaja con su modelo de datos sin obligarlo a cambiar sus clases. (Contiene una pequeña capa ORM impulsada por reflexión).
Instale sqlite-net-pcl desde NuGet.
Importante: deberá agregar el paquete NuGet tanto a su proyecto de biblioteca .NET Standard como a su proyecto de aplicación dependiente de la plataforma .
SQLite-net está todo contenido en 1 archivo (lo sé, es genial, ¿verdad?) y es fácil de agregar a su proyecto. Simplemente agregue SQLite.cs a su proyecto y estará listo para comenzar a crear tablas. Se puede encontrar una implementación asincrónica en SQLiteAsync.cs.
Este es un proyecto de código abierto que agradece contribuciones/sugerencias/informes de errores de quienes lo utilizan. Si tiene alguna idea sobre cómo mejorar la biblioteca, publique un problema aquí en GitHub. Consulte Cómo contribuir.
Consulte la Wiki para obtener, ejem, documentación completa.
La biblioteca contiene atributos simples que puede utilizar para controlar la construcción de tablas. En un programa de acciones simple, podrías 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 ; }
}
Una vez que haya definido los objetos en su modelo, podrá elegir entre API. Puede usar la "API sincrónica" donde las llamadas se bloquean una a la vez, o puede usar la "API asíncrona" donde las llamadas no se bloquean. Es posible que desee utilizar la API asincrónica para aplicaciones móviles para aumentar la capacidad de respuesta.
Ambas API se explican en las dos secciones siguientes.
Una vez que haya definido su entidad, puede generar automáticamente tablas en su base de datos llamando 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 > ( ) ;
Puede insertar filas en la base de datos usando Insert
. Si la tabla contiene una clave primaria autoincrementada, entonces el valor de esa clave estará disponible para usted después de la inserción:
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 ) ;
}
Existen métodos similares para Update
y Delete
.
La forma más sencilla de consultar datos es mediante el método Table
. Esto puede tomar predicados para restringir mediante cláusulas WHERE y/o agregar 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 ) ;
También puede consultar la base de datos a bajo nivel utilizando el método Query
:
public static IEnumerable < Valuation > QueryValuations ( SQLiteConnection db , Stock stock ) {
return db . Query < Valuation > ( " select * from Valuation where StockId = ? " , stock . Id ) ;
}
El parámetro genérico del método Query
especifica el tipo de objeto que se creará para cada fila. Puede ser una de sus clases de tabla o cualquier otra clase cuyas propiedades públicas coincidan con la columna devuelta por la consulta. Por ejemplo, podríamos reescribir la consulta anterior 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 ) ;
}
Puede realizar actualizaciones de bajo nivel de la base de datos utilizando el método Execute
.
La biblioteca asincrónica utiliza la biblioteca paralela de tareas (TPL). Como tal, el uso normal de los objetos Task
y las palabras clave async
y await
funcionarán para usted.
Una vez que haya definido su entidad, puede generar tablas automáticamente llamando 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! " ) ;
Puede insertar filas en la base de datos usando Insert
. Si la tabla contiene una clave primaria autoincrementada, entonces el valor de esa clave estará disponible para usted después de la inserción:
var stock = new Stock ( )
{
Symbol = " AAPL "
} ;
await db . InsertAsync ( stock ) ;
Console . WriteLine ( " Auto stock id: {0} " , stock . Id ) ;
Existen métodos similares para UpdateAsync
y DeleteAsync
.
La consulta de datos se realiza de forma más sencilla mediante el método Table
. Esto devolverá una instancia AsyncTableQuery
, tras lo cual podrá agregar predicados para restringir mediante cláusulas WHERE y/o agregar ORDER BY. La base de datos no se toca físicamente hasta que se llama a uno de los métodos de recuperación especiales ( ToListAsync
, FirstAsync
o FirstOrDefaultAsync
).
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 ) ;
Hay varios métodos de bajo nivel disponibles. También puede consultar la base de datos directamente mediante el método QueryAsync
. Además de las operaciones de cambio proporcionadas por InsertAsync
, etc., puede emitir métodos ExecuteAsync
para cambiar conjuntos de datos directamente dentro de la base de datos.
Otro método útil es ExecuteScalarAsync
. Esto le permite devolver un valor escalar de la base de datos fácilmente:
var count = await db . ExecuteScalarAsync < int > ( " select count(*) from Stock " ) ;
Console . WriteLine ( string . Format ( " Found '{0}' stock items. " , count ) ) ;
sqlite-net se usa normalmente como un ORM ligero (mapeador relacional de objetos) usando los métodos CreateTable
y Table
. Sin embargo, también puede utilizarlo como una forma cómoda de ejecutar consultas manualmente.
A continuación se muestra un ejemplo de cómo crear una tabla, insertarla (con un comando parametrizado) y consultarla sin utilizar funciones 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 " ) ;
Puede utilizar una base de datos cifrada utilizando el paquete NuGet sqlite-net-sqlcipher.
La clave de la base de datos se establece en SqliteConnectionString
pasado al constructor de la conexión:
var options = new SQLiteConnectionString ( databasePath , true ,
key : " password " ) ;
var encryptedDb = new SQLiteAsyncConnection ( options ) ;
Si necesita configurar pragmas para controlar el cifrado, se pueden pasar acciones a la cadena de conexión:
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 ) ;
Gracias a la comunidad .NET por aceptar este proyecto y gracias a todos los contribuyentes que han ayudado a hacerlo grandioso.
¡Gracias también a Tirza van Dijk (@tirzavdijk) por el fantástico logo!