Flutter本地数据存储插件hive_plus的使用
Flutter本地数据存储插件hive_plus的使用
快速、愉悦且安全的NoSQL数据库
Hive是一个用纯Dart编写的轻量级且超快的键值数据库。灵感来源于Bitcask。
文档与示例 📖
开始前 #
这是一个基于遗留版 hive
(v2.2.3) 的分叉版本。我大量使用了这个hive,并发现它非常高效,所以我尝试恢复它。现在它可以支持Web端的WASM编译。
功能 #
- 🚀 跨平台:移动设备、桌面、浏览器
- ⚡ 极佳性能(参见 基准测试)
- ❤️ 简单、强大且直观的API
- 🔒 强大的内置加密
- 🎈 没有原生依赖
- 🔋 所有必需组件都已包含
开始使用 #
请查看快速入门文档来开始使用。
使用方法 #
你可以像使用map一样使用Hive。无需等待 Futures
。
var box = Hive.box('myBox');
box.put('name', 'David');
var name = box.get('name');
print('Name: $name');
BoxCollections #
BoxCollections
是一组可以类似普通盒子使用的盒子,但在Web端可以显著提高速度。它们支持一次性打开和关闭集合中的所有盒子,并更有效地在IndexedDB上存储数据。
此外,它们还提供了事务,可以在Web端处理大量的数据库事务。
在 dart:io
平台上,BoxCollections或事务没有性能提升。只有BoxCollections可能对某些盒子层次结构和开发体验有用。
// 创建一个盒子集合
final collection = await BoxCollection.open(
'MyFirstFluffyBox', // 数据库名称
{'cats', 'dogs'}, // 盒子名称
path: './', // 存储盒子的路径(仅在Flutter/Dart IO中使用)
key: HiveCipher(), // 加密盒子的密钥(仅在Flutter/Dart IO中使用)
);
// 打开你的盒子。可选:指定类型。
final catsBox = collection.openBox<Map>('cats');
// 放入一些东西
await catsBox.put('fluffy', {'name': 'Fluffy', 'age': 4});
await catsBox.put('loki', {'name': 'Loki', 'age': 2});
// 获取类型为(不可变)Map的值
final loki = await catsBox.get('loki');
print('Loki is ${loki?['age']} years old.');
// 返回一个值列表
final cats = await catsBox.getAll(['loki', 'fluffy']);
print(cats);
// 返回一个所有键的字符串列表
final allCatKeys = await catsBox.getAllKeys();
print(allCatKeys);
// 返回一个所有键和条目的映射
final catMap = await catsBox.getAllValues();
print(catMap);
// 删除一个或多个条目
await catsBox.delete('loki');
await catsBox.deleteAll(['loki', 'fluffy']);
// 或者一次清空整个盒子
await catsBox.clear();
// 使用事务加速写操作
await collection.transaction(
() async {
await catsBox.put('fluffy', {'name': 'Fluffy', 'age': 4});
await catsBox.put('loki', {'name': 'Loki', 'age': 2});
// ...
},
boxNames: ['cats'], // 默认情况下,所有盒子都会被锁定。
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是在考虑Flutter的情况下编写的。如果你需要一个轻量级的数据存储解决方案,它非常适合你的应用。添加所需的依赖项并初始化Hive后,你可以在项目中使用Hive:
import 'package:hive_plus/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);
}
);
},
);
}
}
盒子被缓存,因此足够快,可以直接在Flutter小部件的 build()
方法中使用。
本地AES加密实现 #
当使用Flutter时,Hive支持使用 package:cryptography 和 package:cryptography_flutter 进行本地加密。
本地AES实现极大地提高了加密盒子的操作速度。
请遵循以下步骤:
- 在pubspec.yaml中添加依赖项
dependencies:
cryptography_flutter: ^2.0.2
- 启用本地实现
import 'package:cryptography_flutter/cryptography_flutter.dart';
void main() {
// 启用Flutter加密
FlutterCryptography.enable();
// ....
}
更多关于Flutter本地数据存储插件hive_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地数据存储插件hive_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用hive_plus
插件进行本地数据存储的示例代码。hive_plus
是Hive的一个增强版本,提供了对Web平台的支持以及更好的性能。
首先,确保你的Flutter项目已经包含了hive
和hive_flutter
(用于Flutter平台)以及hive_plus
(如果你需要Web支持)的依赖。在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
hive: ^2.0.4 # 请检查最新版本号
hive_flutter: ^1.1.0 # 请检查最新版本号
hive_plus: ^3.0.0 # 如果你需要Web支持,并请检查最新版本号
然后,运行flutter pub get
来获取这些依赖。
接下来,你需要初始化Hive。通常,这会在你的应用程序的入口点(例如main.dart
)进行。
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:hive_plus/hive_plus.dart'; // 如果你需要Web支持
import 'package:path_provider/path_provider.dart';
void main() async {
// 确定应用程序的本地存储目录
final appDocumentDirectory = await getApplicationDocumentsDirectory();
Hive.init(appDocumentDirectory.path);
// 注册你的Hive类型(假设你有一个名为User的模型)
await Hive.registerAdapter(UserAdapter());
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
假设你有一个名为User
的Hive模型类,以及相应的UserAdapter
:
import 'package:hive/hive.dart';
part 'user.g.dart';
@HiveType(typeId: 0)
class User extends HiveObject {
@HiveField(0)
String name;
@HiveField(1)
int age;
User(this.name, this.age);
}
生成user.g.dart
文件需要运行flutter pub run build_runner build
命令。这需要使用build_runner
包,所以确保你的dev_dependencies
中有以下依赖:
dev_dependencies:
build_runner: ^2.0.4 # 请检查最新版本号
hive_generator: ^1.1.0 # 请检查最新版本号
现在,你可以在你的应用程序中使用Hive来存储和检索数据。例如,在HomePage
中:
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'user.dart'; // 导入你的User类
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Box<User> _userBox;
@override
void initState() {
super.initState();
// 打开一个Hive Box来存储User对象
_userBox = Hive.box<User>('users');
// 添加一些初始数据(可选)
_addInitialData();
}
void _addInitialData() {
var user1 = User('Alice', 30);
var user2 = User('Bob', 25);
_userBox.add(user1);
_userBox.add(user2);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Hive Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Users:'),
Expanded(
child: ListView.builder(
itemCount: _userBox.length,
itemBuilder: (context, index) {
var user = _userBox.getAt(index);
return ListTile(
title: Text('${user.name}, ${user.age}'),
);
},
),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 添加新用户
var newName = 'Charlie';
var newAge = 22;
var newUser = User(newName, newAge);
_userBox.add(newUser);
setState(() {}); // 更新UI
},
tooltip: 'Add User',
child: Icon(Icons.add),
),
);
}
}
这个示例展示了如何使用Hive在Flutter应用程序中存储和检索用户数据。你可以根据需要扩展和修改这个示例。