连接到 SQLite 数据库
SQLite.Net 通过“SQLiteConnection”对象建立与 SQLite 数据库的连接。 实例化此对象时,必须传入数据库文件的文件名。 然后,它将打开文件(如果存在文件)或创建文件(如果不存在文件)。
下面是其用法示例:
string filename = ...
SQLiteConnection conn = new SQLiteConnection(filename);
创建表
回想一下,SQLite.NET 是对象关系映射器,这意味着可以通过 C# 类生成数据库架构。 返回 User 类的上一个示例。
SQLite.NET 可通过此 C# 类生成数据库架构,但许多属性可供添加到类中,用于对架构进行修改。
以下是可用属性的一些示例:
Table:如果希望表名不是类名,请指定表的名称。
primaryKey:指定要为主键的列。
AutoIncrement:指定在插入新行时,列值应自动增加。
Column:如果不想使用属性名作为列名,请指定列的名称。
MaxLength:指定列中可使用的最大字符数。
Unique:指定列中的值必须与其他所有行不同。
回到“User”类,下面是使用所有这些属性的版本:
[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; }
...
}
异步查询
若要生成响应速度极快的移动应用程序,需要以略有不同的方式执行操作。 如果在 UI 线程上运行数据库操作,则可能会导致 UI 在操作需要很长时间才能完成时冻结。
为了解决此问题,SQLite.NET 通过“SQLiteAsyncConnection”类包含了一个异步 API。 例如,若要异步创建表,可使用“CreateTableAsync”方法:
var conn = new SQLiteAsyncConnection(dbPath);
await conn.CreateTableAsync<User>();
使用 SQLite.NET 执行异步操作
“SQLiteAsyncConnection”公开与同步对应类相同的操作。 但是,操作均基于任务,以便在后台使用。
下面列出了一些常见的异步操作:
CreateTableAsync:根据指示的类创建表
DropTableAsync:删除与指示的类关联的表
GetAsync:获取表中与指示的类关联的记录,并匹配传入构造函数的主键
InsertAsync:使用传入构造函数的项插入新记录
UpdateAsync:使用传入构造函数的项更新现有记录
DeleteAsync:删除表中映射到指示类的记录,并匹配传入构造函数的主键
QueryAsync:运行直接 SQL 查询并返回对象
ExecuteAsync:运行直接 SQL 查询并返回受影响的行数。
ExecuteScalarAsync:运行直接 SQL 查询并返回单个结果
ToListAsync:异步执行“Table”方法
以下是使用“ToListAsync”方法异步检索记录的示例:
SQLiteAsyncConnection conn;
ObservableCollection<User> userList; // Bound to UI
...
public async Task AddAllUsersAsync()
{
List<User> users = await conn.Table<User>().ToListAsync();
// Must be on UI thread here!
foreach (var u in users)
userList.Add(u);
}
使用 LINQ 执行 SQLite 查询
虽然可使用“Table”方法在表中检索所有行,但并不总是想要这样做。 有时,想要仅返回行的子集或运行更复杂的查询。 对于这些任务,请将 LINQ 与 SQLite.NET 配合使用。
SQLite.NET 支持许多常见的 LINQ 查询,其中包括:
Where
Take
Skip
OrderBy
OrderByDescending
ThenBy
ElementAt
First
FirstOrDefault
ThenByDescending
Count
通过这些方法,你可以使用扩展方法语法或 LINQ C# 语法。 例如,下面是可供使用 LINQ C# 语法按用户名获取用户的代码片段:
public User GetByUsername(string username)
{
var user = from u in conn.Table<Person>()
where u.Username == username
select u;
return user.FirstOrDefault();
}