[译]纯Dart键值(对象)数据库hive

1,022 阅读2分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」。

本文翻译自pub: hive | Dart Package (flutter-io.cn)

译时版本: hive 2.0.5


image.png

快速、 有趣且安全的 NoSQL 数据库

Hive 是用纯 Dart 编写的轻量且超级快速的键-值数据库。受 Bitcask 启发。

文档 & 示例 📖 

如果需要查询、多isolate(隔离)支持或者在对象间链接,可查看 Isar 数据库。

特性

  • 🚀 多平台:移动端、桌面端、浏览器
  • ⚡ 优秀的性能(参考 性能基准
  • ❤️ 简单、强大且直观的 API
  • 🔒 内置的强加密
  • 🎈 无需 原生依赖
  • 🔋 功能齐全

开始

查看 Quick Start 文档开始。

用法

可以像 Map 一样使用 Hive。无需 Futures

var box = Hive.box('myBox');

box.put('name', 'David');

var name = box.get('name');

print('Name: $name');

存储对象

Hive 不仅支持原始类型、列表和 Map ,也支持你想使用的任何 Dart 对象。需要生成类型适配器使其能够存储对象。

@HiveType(typeId: 0)
class Person extends HiveObject {

  @HiveField(0)
  String name;

  @HiveField(1)
  int age;
}

继承 HiveObject 是可选的,但它提供了一些方便的方法如 save() 和 delete()

var box = await Hive.openBox('myBox');

var person = Person()
  ..name = 'Dave'
  ..age = 22;
box.add(person);

print(box.getAt(0)); // Dave - 22

person.age = 30;
person.save();

print(box.getAt(0)) // Dave - 30

Hive ❤️ Flutter

Hive 在编写时考虑到了 Flutter。 如果应用需要一个轻量的数据库,那 Hive 是一个完美选择。 在添加所需的依赖和初始化 Hive 后,就可以在工程中使用 Hive 了:

import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

class SettingsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      valueListenable: Hive.box('settings').listenable(),
      builder: (context, box, widget) {
        return Switch(
          value: box.get('darkMode'),
          onChanged: (val) {
            box.put('darkMode', val);
          }
        );
      },
    );
  }
}

Box 会被缓存,所以足够快速以直接在 Flutter 组件的 build() 方法中使用。

(性能)基准 

1000 读迭代1000 写迭代
image.pngimage.png
SharedPreferences 在读性能方面和 Hive 差不多。SQLite 性能会差很多。在写或删除方面,Hive 显著优于 SQLite 和 SharedPreferences 。

性能基准是使用 Oneplus 6T 的 Android Q 来测试。你可以自己运行基准测试

*对此性能基准可持保留态度。 客观地比较数据库是非常困难的,因为它们是为了不同的目的开发的。

许可证

Apache License, Version 2.0

许可证原文