持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
Isar:用于 Futter 可跨平台的超快数据库
官方文档:Home | Isar Database
pub:isar | Dart Package (flutter-io.cn)
本文翻译自:Create, Read, Update, Delete | Isar Database
译时版本:3.0.2
增查改删
当你已经定义好集合后,学习一下如何操作它们!
打开 Isar
在做任何事之前,都必须打开一个 Isar 实例。每个实例需要有写权限的目录。 如果没有指定目录,Isar 会查找合适的默认目录用于当前平台。
final isar = await Isar.open([ContactSchema]);
你可以使用默认配置或者提供以下参数中的部分参数。
| 配置 | 说明 |
|---|---|
name | 可以用唯一的 name 打开多个实例,默认情况下使用 "default" 。 |
schemas | 想要使用的所有集合 Schema 的列表。所有的实例都需要使用相同的 Schema 。 |
directory | 实例的存储位置。可以传递相对路径或绝对路径。默认情况下,iOS 使用 NSDocumentDirectory ,Android 使用 getDataDirectory 。 最终的位置是 path/name.isar 。在 Web 上不需要配置。 |
relaxedDurability | 放宽持久性保证以提高写性能。假如系统崩溃(不是应用崩溃),可能会丢失最后提交的事务。数据库不会坏掉。 |
compactOnLaunch | 当实例被打开时,检查数据库是否需要压缩。 |
inspector | 为设置编译启用 |
| Inspector 。对于 profile 编译和 发布编译,该选项会被忽略。 |
可以在全局变量存储 Isar 实例或使用喜欢的依赖注入包来管理它。
如果实例已经打开,调用 Isar.open() 会给出现有的实例,而忽视掉指定的参数。这对于在 isolate (隔离)中使用 Isar 是有用的。
考虑使用 path_provider 包在所有平台获取一个可用的路径。
集合
集合对象是你如何查找、查询和创建指定类型的新记录。
获取集合
所有的集合都存在于 Isar 实例中。记住前面我们用 @Collection() 注解的 Contact 类。可以用下面的代码获取 contact 集合:
final contacts = isar.contacts;
这很简单!
获取一条记录(使用 id)
final contact = await contacts.get(someId);
get() 返回 Future 。默认情况下,所有的 Isar 操作都是异步的。大多数操作都有对应的同步操作:
final contact = contacts.getSync(someId);
建议在 UI isolate(隔离)中使用异步版本。因为 Isar 非常快,使用同步版本通常没问题。
查询记录
使用 .where() 和 .filter() 查找匹配给定条件的记录列表:
final allContacts = await contacts.where().findAll();
final starredContacts = await contacts.filter()
.isStarredEqualTo(true)
.findAll();
➡️ 学习更多:查询
修改数据库
要创建、修改或删除记录,可使用各自在写事务中封装的操作:
await isar.writeTxn(() async {
final contact = await contacts.get(someId)
contact.isStarred = false;
await contacts.put(contact); // 执行更新操作
await contact.delete(contact.id); // 或删除操作
});
➡️ 学习更多:事务
创建一条新记录
对象还没有被 Isar 管理时,需要把它 .put() 到集合中。如果 id 字段 是 null 或者 Isar.autoIncrement , Isar 会使用自增的 id 。
final newContact = Contact()
..firstName = "Albert"
..lastName = "Einstein"
..isStarred = true;
await isar.writeTxn(() async {
await contacts.put(newContact);
})
如果 id 字段不是 final 的, Isar 会自动给对象指定新的 id 。
更新一条记录
创建和更新处理都会使用 yourCollection.put(yourObject) 。如果 id 是 null (或者不存在),对象会被插入,否则会被更新。
删除记录
await isar.writeTxn(() async {
contacts.delete(contact.id);
});
或者:
await isar.writeTxn(() async {
final idsOfUnstarredContacts = await contacts.filter()
.isStarredEqualTo(false)
.idProperty()
.findAll();
contacts.deleteAll(idsOfUnstarredContacts);
});