Hive
用纯 Dart 编写的轻量级快速键值数据库。
Hive 是一个用纯 Dart 编写的轻量级且超快的键值对数据库。受Bitcask启发。
文档和样本 📖
考虑使用Isar,这是 Hive 作者的 Flutter 数据库,它在各方面都非常出色!
查看快速入门文档以开始使用。
您可以像使用地图一样使用 Hive。没有必要等待 Futures
。
var box = Hive.box('myBox');
box.put('name', 'David');
var name = box.get('name');
print('Name: $name');
BoxCollections
是一组可以像普通盒子一样使用的盒子,除了它们显着提高了网络速度。它们支持一次打开和关闭集合的所有框,并更有效地将数据存储在网络上的索引数据库中。
此外,它们还公开了可用于加速 Web 上大量数据库事务的事务。
在 dart:io
平台上,BoxCollections 或 Transactions 没有性能提升。只有 BoxCollections 可能对某些盒子层次结构和开发经验有用。
// Create a box collection
final collection = await BoxCollection.open(
'MyFirstFluffyBox', // Name of your database
{'cats', 'dogs'}, // Names of your boxes
path: './', // Path where to store your boxes (Only used in Flutter / Dart IO)
key: HiveCipher(), // Key to encrypt your boxes (Only used in Flutter / Dart IO)
);
// Open your boxes. Optional: Give it a type.
final catsBox = collection.openBox<Map>('cats');
// Put something in
await catsBox.put('fluffy', {'name': 'Fluffy', 'age': 4});
await catsBox.put('loki', {'name': 'Loki', 'age': 2});
// Get values of type (immutable) Map?
final loki = await catsBox.get('loki');
print('Loki is ${loki?['age']} years old.');
// Returns a List of values
final cats = await catsBox.getAll(['loki', 'fluffy']);
print(cats);
// Returns a List<String> of all keys
final allCatKeys = await catsBox.getAllKeys();
print(allCatKeys);
// Returns a Map<String, Map> with all keys and entries
final catMap = await catsBox.getAllValues();
print(catMap);
// delete one or more entries
await catsBox.delete('loki');
await catsBox.deleteAll(['loki', 'fluffy']);
// ...or clear the whole box at once
await catsBox.clear();
// Speed up write actions with transactions
await collection.transaction(
() async {
await catsBox.put('fluffy', {'name': 'Fluffy', 'age': 4});
await catsBox.put('loki', {'name': 'Loki', 'age': 2});
// ...
},
boxNames: ['cats'], // By default all boxes become blocked.
readOnly: false,
);
Hive 不仅支持原语、列表和映射,还支持您喜欢的任何 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 后,您可以在项目中使用 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);
}
);
},
);
}
}
盒子是缓存的,因此速度足够快,可以直接在 build()
Flutter 小部件的方法中使用。
使用 Flutter 时,Hive 支持使用package:cryptography 和package:cryptography_flutter进行本机加密。
原生 AES 实现极大地加速了加密盒子的操作。
请按照以下步骤操作:
dependencies:
cryptography_flutter: ^2.0.2
import 'package:cryptography_flutter/cryptography_flutter.dart';
void main() {
// Enable Flutter cryptography
FlutterCryptography.enable();
// ....
}
1000 次读取迭代 | 1000 次写入迭代 |
---|---|
SharedPreferences 在读取性能方面与 Hive 相当。SQLite 的表现要差得多。 | 在写入或删除方面,Hive 大大优于 SQLite 和 SharedPreferences。 |
基准测试是在装有 Android Q 的 Oneplus 6T 上执行的。您可以自己运行基准测试。
*以一粒盐来衡量这个基准。很难客观地比较数据库,因为它们是为不同目的而制作的。
Copyright 2019 Simon Leier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.