前言
官方原话:Hive是为Flutter设计的。如果您需要一个轻量级的数据存储来支持您的应用,它非常合适。添加所需的依赖并初始化Hive后,您就可以在项目中使用Hive了
Hive 是一款用纯 Dart 编写的轻量级且极速的键值数据库,其灵感来源于 Bitcask。
其实简单的来说,上手简单
特点
- 跨平台:移动、桌面、浏览器
- ⚡ 性能卓越(参见基准测试)
- ❤️ 简单、强大、直观的应用程序接口
- 内置强大的加密功能
- 无本地依赖性
使用
第一步,先引入库
dependencies:
hive: ^2.2.3
hive_flutter: ^1.1.0
dev_dependencies:
hive_generator: 2.0.1
build_runner: 2.4.8
接下来在main 里初始化
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
Hive.registerAdapter(ContactAdapter());//实体方式保存
await Hive.openBox(userBox);//直接键对值保存
runApp(const MyApp());
}
疑问一:ContactAdapter 这个怎么来的呢? 先看图
我们在目录(这里为了测试,放在根目录了,建议是放置在数据目录)新建contact_page.dart
import 'package:hive/hive.dart';
part 'contact_page.g.dart';//一定要注意,跟实体名称一致
@HiveType(typeId: 0)
class Contact extends HiveObject {
@HiveField(0)
final String name;
@HiveField(1)
final int age;
Contact({required this.name,required this.age});
}
接下来我们在命令窗口执行这串命令,会自动生成文件
flutter packages pub run build_runner build --delete-conflicting-outputs
下面为主页demo的完整代码
const String userBox = “user_box”; //临时键值存储表
const String contactBox = “contact_box”; //实体数据表
class MyHomePage extends StatefulWidget {
const MyHomePage({
super.key,
});
@override
State createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
final _shoppingBox = Hive.box(userBox);
int _counter = 0;
List contractLis = [];
void _add() {
_counter++;
addData(_counter);
_shoppingBox.put(‘key’, ‘我是普通的键值’);
loadData();
}
@override
void initState() {
super.initState();
loadData();
}
Future addData(int index) async {
var box = await Hive.openBox(contactBox); // 存储数据
var user = Contact(name: ‘Johnny
i
n
d
e
x
′
,
a
g
e
:
i
n
d
e
x
)
;
a
w
a
i
t
b
o
x
.
p
u
t
(
′
index', age: index); await box.put('
index′,age:index);awaitbox.put(′{DateTime.timestamp().millisecond}’, user);
}
Future loadData() async {
// 读取数据
var box = await Hive.openBox(contactBox); // 存储数据
contractLis = box.values.toList();
contractLis.sort((a, b) => b.age.compareTo(a.age));
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(“demo”),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
‘简单存储’,
),
Text(
_shoppingBox.get(‘key’) ?? “暂无设置”,
),
const SizedBox(
height: 12,
),
const Text(
‘实体存储’,
),
…contractLis
.map((e) => Text(
e.name ?? “”,
))
.toList(),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _add,
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
说明
--
final \_shoppingBox = Hive.box(userBox); 可以不用在Future 调用,非常的舒服 但是要执行 openBox操作一定需要,切记
var box = await Hive.openBox(contactBox);
首次编译成功后,本地会增加俩文件 user\_box 和 contact\_box,这俩文件是存储咋们的内容的文件
```bash
在这里插入代码片
如果你看到了这里,觉得文章写得不错就给个赞呗?
更多Android进阶指南 可以扫码 解锁更多Android进阶资料
敲代码不易,关注一下吧。ღ( ´・ᴗ・` )