[译]用于 Futter 可跨平台的超快数据库 Isar

1,067 阅读3分钟

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


本文翻译自 isar | Dart Package (flutter-io.cn)

译时版本: isar: ^3.0.1


image.png

Isar Database

快速开始 • 文档 • 示例应用 • 支持 & 想法 • Pub.dev

Isar [ee-zahr]:

  1. 德国巴伐利亚州的一条河流
  2. 快到疯狂的 NoSQL 数据库,用起来充满乐趣。

特性

  • 💙 用于Flutter 易用、无配置、无模板文件。
  • 🚀 高度可扩展 天空是它的极限(意在一语双关)
  • 🍭 特性丰富 复合且多条目索引、查询修饰符、JSON 支持等。
  • ⏱ 异步 默认支持 并行查询操作 和 多隔离。
  • 🦄 开源 所有的都是永远开源和免费的!

Isar 可以做到更多(我们才刚刚开始)

  • 🕵️ 全文检索 使检索快速且有趣
  • 📱 多平台 iOS 、Android 、桌面和完整的 WEB 支持!
  • 🧪 ACID 语义 依赖一致性
  • 💃 静态类型 编译时检查和自动完成的查询。
  • ✨ 漂亮的文档 可读、易于理解并在不断改进

加入 Telegram group 进行讨论,也能对新版本的 DB 先睹为快。

如果想要说感谢,可在 Github 上给个 star 或者在 pub.flutter-io.cn 给个 like 🙌💙

快速开始

非常荣幸你在这里!让我们开始使用最酷的 Flutter 数据库吧。。。

1. 添加到 pubspec.yaml 

isar_version: &isar_version 3.0.1 # 定义要使用的版本

dependencies:
  isar: *isar_version
  isar_flutter_libs: *isar_version # 包含 Isar Core

dev_dependencies:
  isar_generator: *isar_version
  build_runner: any

2. 注解 Collection 

part 'email.g.dart';

@collection
class Email {
  Id id = Isar.autoIncrement; // 也可以使用 use id = null 用于自增

  @Index(type: IndexType.value)
  String? title;

  List<Recipient>? recipients;

  @enumerated
  Status status = Status.pending;
}

@embedded
class Recipient {
  String? name;

  String? address;
}

enum Status {
  draft,
  sending,
  sent,
}

3. 打开实例

final isar = await Isar.open([EmailSchema]);

4. 查询数据库

final emails = await isar.emails.filter()
  .titleContains('awesome', caseSensitive: false)
  .sortByStatusDesc()
  .limit(10)
  .findAll();

Isar Inspector

Isar Inspector 允许你实时查看应用的 Isar 实例和集合。可以执行查询、编辑属性、切换实例和排序数据。

inspector.gif

CRUD 操作

使用 IsarCollection ,所有基本的 CRUD 操作都可用。

final newEmail = Email()..title = 'Amazing new database';

await isar.writeTxn(() {
  await isar.emails.put(newEmail); // 插入 & 更新
});

final existingEmail = await isar.emails.get(newEmail.id!); // 获取

await isar.writeTxn(() {
  await isar.emails.delete(existingEmail.id!); // 删除
});

查询

Isar 拥有强大的查询语言,它允许你使用索引、过滤唯一对象、使用复杂的 and() 、 or()  和 xor() 聚集、查询链接和排序结果。

final importantEmails = isar.emails
  .where()
  .titleStartsWith('Important') // 使用索引
  .limit(10)
  .findAll()

final specificEmails = isar.emails
  .filter()
  .recipient((q) => q.nameEqualTo('David')) // 查询嵌入的对象
  .or()
  .titleMatches('*university*', caseSensitive: false) // title 包含 'university' (忽略大小写)
  .findAll()

数据库监视器

使用 Isar 数据库,可以监视集合、对象或查询。监视器会在事务成功提交并且目标真正改变时被通知。 监视器可以是延迟的并不会重新加载数据、或者可以是非延迟的并在后台取得新的结果。

Stream<void> collectionStream = isar.emails.watchLazy();

Stream<List<Post>> queryStream = importantEmails.watch();

queryStream.listen((newResult) {
  // 进行 UI 更新
})

性能指标

性能指标只是提供了一个数据库性能的粗略的概念,但你也能看到,Isar NoSQL 数据库非常快。😇

image.pngimage.png
image.pngimage.png

如果你对其它的性能指标感兴趣,或者想测试下 Isar 在你的设备上的性能表现,你可以自己运行 benchmarks 。

单元测试

如果想在单元测试或者 Dart 代码中使用 Isar 数据库,在测试中使用 Isar 之前调用 await Isar.initializeIsarCore(download: true) 。

Isar NoSQL 数据库会为你的平台自动下载正确的二进制。 你也可以传递 libraries Map 为每个平台调整下载的位置。

确保使用 flutter test -j 1 避免并行运行测试。 这会打断自动下载。

贡献者

许可证

Apache License, Version 2.0 许可,可参考原文。