[官文翻译]Dart轻量超快键值数据库Hive - 其它

720 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情


原文链接:

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

pub译文: [译]纯Dart键值(对象)数据库hive - 掘金 (juejin.cn)

译时版本: hive 2.1.0


用于 VSCode 的代码片段

感谢 @peekpt ,这里有些为 Hive 构建模型类的代码片段。它们可以在写代码时(快捷)写入 HiveObject

snippets.gif

安装

向 VSCode 中添加 Hive 代码片段非常简单:

  1. Cmd(Ctrl)+Shift+P 调出命令,然后输入 snippets
  2. 选择 Configure User Snippets ,选中 dart.json
  3. 粘贴下面的代码然后保存。

用法

  • 创建 dart 文件 example.dart
  • 输入下面的命令之一
  • 使用h tab 可以导航输入位置
命令动作
hive创建 Hive Model 的基本结构并继承 HiveObject
hivec创建 Hive Model 的基本结构。
hf创建 HiveField() 注解。
ht创建 HiveType() 注解。
hfs创建字符串的 Hive 字段。
hfi创建 int 的 Hive 字段。
hfb创建 bool 的 Hive 字段。
hfl创建 List 的 Hive 字段。
hfd创建 double 的 Hive 字段。
{
  "HiveType class extends HiveObject": {
    "prefix": "hive",
    "body": [
      "import 'package:hive/hive.dart';",
      "",
      "part '${TM_FILENAME_BASE}.g.dart';",
      "",
      "@HiveType()",
      "class ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/} extends HiveObject {",
      "\t@HiveField(0)",
      "\tString id;",
      "\t${0:// Hive fields go here}",
      "}"
    ],
    "description": "Creates an HiveType class extending HiveObject structure based on the filename."
  },
  "HiveType class": {
    "prefix": "hivc",
    "body": [
      "import 'package:hive/hive.dart';",
      "",
      "part '${TM_FILENAME_BASE}.g.dart';",
      "",
      "@HiveType()",
      "class ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/} {",
      "\t@HiveField(0)",
      "\tString id;",
      "\t${0:// Hive fields go here}",
      "}"
    ],
    "description": "Creates an HiveType class structure based on the filename."
  },
  "@HiveField(#)": {
    "prefix": "hf",
    "body": [
      "@HiveField(${1})",
      "${2};",
      "${0}"
    ],
    "description": "Creates @HiveField({number})"
  },
  "@HiveType()": {
    "prefix": "ht",
    "body": [
      "@HiveType()",
      "${0}"
    ],
    "description": "Creates @HiveType()"
  },
  "@HiveField(#) String": {
    "prefix": "hfs",
    "body": [
      "@HiveField(${1})",
      "String ${2};",
      "${0}"
    ],
    "description": "Creates @HiveField({number}) String"
  },
  "@HiveField(#) int": {
    "prefix": "hfi",
    "body": [
      "@HiveField(${1})",
      "int ${2};",
      "${0}"
    ],
    "description": "Creates @HiveField({number}) int"
  },
  "@HiveField(#) bool": {
    "prefix": "hfb",
    "body": [
      "@HiveField(${1})",
      "bool ${2};",
      "${0}"
    ],
    "description": "Creates @HiveField({number}) bool"
  },
  "@HiveField(#) List": {
    "prefix": "hfl",
    "body": [
      "@HiveField(${1})",
      "List<${2}> ${3};",
      "${0}"
    ],
    "description": "Creates @HiveField({number}) List<>"
  },
  "@HiveField(#) double": {
    "prefix": "hfd",
    "body": [
      "@HiveField(${1})",
      "double ${2};",
      "${0}"
    ],
    "description": "Creates @HiveField({number}) double"
  }
}

浏览器支持

Hive 在浏览器中和在VM中运行完全一样。唯一的区别是数据的存储方式。因为浏览器没有文件系统, Hive 使用 IndexedDB 作为后台存储。每个 box 都存储在各自的 IndexedDB 数据库中。不需要关心这些,一切都会正常运转。

需要注意的是,对于用户来说,在浏览器中查看和更改 box 要比在移动手机上容易(例如,使用 Chrome DevTools)。也可以加密 box 来阻止查阅。

所有的 TypeAdapters 都会正常运转。

常见问题

Hive 支持哪些平台?

Hive 支持所有 Dart 虚拟机可运行的平台和浏览器。在浏览器上,使用 IndexedDB 作为后台存储。

什么时候应该用 Hive?

什么时候使用Hive [中文]

什么时候不使用Hive

什么时候不使用Hive [中文]

数据存储在什么位置?

在 home 目录(使用 Hive.init() 设定)中每个 box 有各自的文件。

Hive 是否会即时持久化数据?

是的。

如果应用进程被杀死时会发生什么?

可能发生的最坏情况是最后的实体没有完全写入时会丢失。Hive 内置集成的校验和崩溃恢复机制会处理所有的情况。

为什么 box.get() 是同步的?它不慢吗?

Hive 默认缓存所有的实体,所以不会慢。如果不期望这样,可以使用 lazy boxes 代替。

能使用 Hive 存储二进制数据吗?如图片。

可以,但是不要存储太大的图片(几M就可以)

Hive 能同步数据到服务器吗?

现在还不能直接做到,因为使用 box.toMap() 方法和 改动通知器 可以很容易地去实现。

Hive使用哪种类型的加密?

AES 256 CBC 使用 PKCS7 填充。

需要调用 Hive.close() 吗?

不需要。它会加速下次APP的启动,无需任何担心。

局限

  • 键必须是32位无符号整数或最大长度255个字符的ASCII字符串。
  • 支持的整数值包含所有 -2^53 到 2^53 之间的整数, 和一些有更大数量级的整数。
  • 对象不允许循环调用。Hive 不会检测它们,然后存储会陷入无限循环。
  • 在任何时候,只有一个进程可以访问 box ,否则会出现问题。
  • box 作为文件存储在用户的应用目录中。因此需要避免常见的非法字符/符号如 /%& 。