[官文翻译]Futter超快数据库Isar - 概念 - 监视器

330 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情


Isar:用于 Futter 可跨平台的超快数据库

官方文档:Home | Isar Database

pub:isar | Dart Package (flutter-io.cn)

本文翻译自:Watchers | Isar Database

译时版本:3.0.2


监视器

Isar 可以让你订阅数据库中的变化。 可以 "监视" 特定对象的变化、整个集合的改化、或一个查询的改化。

监视器可以高效地响应数据库中的变化。 例如,可以在联系人添加时重新构建 UI ,当文档更新时发送网络请求 等。

监视器会在事务成交提交之后被通知到然后目标的实际值也会跟着改变。

监视对象

如果想在特定对象创建、更新或删除时收到通知,你应该监视对象:

Stream<User> userChanged = isar.users.watchObject(5);
userChanged.listen((newUser) {
  print('User changed: ${newUser?.name}');
});

final user = User(id: 5)..name = 'David';
await isar.users.put(user);
// 打印: User changed: David

final user2 = User(id: 5)..name = 'Mark';
await isar.users.put(user);
// 打印: User changed: Mark

await isar.users.delete(5);
// 打印: User changed: null

正如上例中看到的,对象不需要存在。 当对象创建时,监视器会被通知到。

这里有一个额外的参数 initialReturn 。如果将其设置为 true ,Isar 会立即向流中添加对象的当前值。

延迟监视

你可能不需要接收新值,只是想接收变化的通知。 这样 Isar 就不需要获取对象:

Stream<void> userChanged = isar.users.watchObjectLazy(5);
userChanged.listen(() {
  print('User 5 changed');
});

final user = User(id: 5)..name = 'David';
await isar.users.put(user);
// 打印: User 5 changed

监视集合

代替监视单个对象,可以监视整个集合并在任意对象添加、更新或删除时收到通知。

Stream<void> userChanged = isar.users.watchLazy();
userChanged.listen(() {
  print('A User changed');
});

final user = User()..name = 'David';
await isar.users.put(user);
//  打印: A User changed

监视查询

监视整个查询都是可以的。 Isar 尽力只在查询结果确实改变后发出通知。 链接致使查询发生改变也不会被通知。 如果链接改变了也需要被通知,可使用集合监视器。

Query<User> usersWithA = isar.users.filter()
    .nameStartsWith('A')
    .build();

Stream<List<User>> queryChanged = usersWithA.watch(initialReturn: true);
queryChanged.listen((users) {
  print('Users with A are: $users');
});
// 打印: Users with A are: []

await isar.users.put(User()..name = 'Albert');
// 打印: Users with A are: [User(name: Albert)]

await isar.users.put(User()..name = 'Monika');
// 不打印

awaited isar.users.put(User()..name = 'Antonia');
// 打印: Users with A are: [User(name: Albert), User(name: Antonia)]

如果使用了 偏移(offset) & 限定记录数(limit) 或 去重(disctinct)查询,Isar 也会在匹配过滤的对象但在查询之外的结果发生改变时发出通知。

就像 watchObject() ,当查询结果改变但并不需要获取结果时可以使用 watchLazy()

为所有变化重新运行查询非常低效。 应该使用延迟的集合监视器来代替。