SQLite
是一种流行的开源关系型数据库,它的设计目标是提供轻量级、高效、可靠和易用的数据存储服务。由于SQLite
无需单独的服务器进程,它通常被用于嵌入式系统和单机应用程序中,也可以用于网络应用程序的辅助数据库。
今天给大家推荐一个.NET开发的 SQLite ORM
库SQLite-net
,非常好用,性能也很棒!
关于 SQLite-net
SQLite-net 是一个快速、便捷的数据库层。它的设计遵循以下目标:
.NET CLI方式:
dotnet add package sqlite-net-pcl
Package Manager方式:
Install-Package sqlite-net-pcl
定义实体类:
public class User
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
}
SQLite-net 提供两种 API 来执行数据库操作:同步 API 和异步 API。同步 API 会阻塞当前线程,直到数据库操作完成。异步 API 不会阻塞当前线程,而是允许线程继续执行其他任务,直到数据库操作完成。
同步API使用:
// 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<User>();
上面代码可以创建在数据库中,自动创建表User
。
添加、更新和删除
using (var db = new SQLiteConnection("MyData.db")) {
// 添加
var user = new User { Name = "张三" };
db.Insert(user);
// 读取
var users = db.Table<User>().ToList();
// 更新
var userToUpdate = db.Get<User>(1);
userToUpdate.Name = "张三222";
db.Update(userToUpdate);
// 删除
var userToDelete = db.Get<User>(2);
db.Delete(userToDelete);
}
使用SQL 执行命令和查询
db.Execute ("insert into User(Name) values (?)", "李四");
var user_model = db.Query<User> ("select * from User where Id=?",3);
异步API使用
与同步API使用类似
using (var db = new SQLiteConnection("MyData.db")) {
//创建表
await db.CreateTableAsync<User>();
// 添加
await db.InsertAsync(new User { Name = "张三" });
// 查询
var users = await db.Table<User>().ToListAsync();
// 更新
var userToUpdate = await db.GetAsync<User>(1);
userToUpdate.Name = "张三222";
await db.UpdateAsync(userToUpdate);
// 删除
var userToDelete = await db.GetAsync<User>(2);
await db.DeleteAsync(userToDelete);
}
加密支持
加密一直是 SQLite 的一个重要问题,数据库加密在一定程度上可以保护数据,防止其他人直接访问数据库。SQLite-net 可以通过 sqlite-net-sqlcipher
加密数据库
sqlite-net-sqlcipher包安装:
.NET CLI方式
dotnet add package sqlite-net-sqlcipher
Package Manager方式
Install-Package sqlite-net-sqlcipher
安装完成后,在连接数据库的时候, 密码需要在传递给连接构造函数时设置。
var options = new SQLiteConnectionString(databasePath, true,
key: "password");
var encryptedDb = new SQLiteAsyncConnection(options);
如果需要设置加密 pragma,可以将操作传递给连接字符串。
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);
sqlite-net代码地址:https://github.com/praeclarum/sqlite-net