[官文翻译]Futter超快数据库Isar - 概念 - 增查改删

1,102 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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);
});