Hive 是一个高效、轻量级的 NoSQL 数据库,适用于 Flutter 和 Dart 的开发。它以高性能和简便性著称,特别适合需要本地存储的小型到中型数据集的场景:
Hive 的主要特点:
高性能:Hive 是内存映射的数据库,具有快速的读写性能。
轻量级:不依赖于 SQL,数据库文件小,适合移动端使用 还可以在web端使用。
简单易用:API 设计简洁,容易上手。
无需网络连接:所有数据都保存在本地,适合离线应用。
支持 Dart 对象:Hive 允许直接存储和读取 Dart 对象,无需额外的序列化步骤。
添加依赖
hive: ^2.2.3
hive_flutter: ^1.1.0
path_provider: ^2.1.3 #获取文件储存位置
封装
class HiveUtil { HiveUtil._internal(); // 私有的构造方法,防止外部实例化 factory HiveUtil() => _instance; // 工厂方法,返回 HiveUtil 唯一实例 static late final HiveUtil _instance = HiveUtil._internal(); // HiveUtil 唯一实例 static late Box _box; // Hive Box 对象 static Future<HiveUtil> getInstance(String boxName) async { if (!Hive.isBoxOpen(boxName)) { _box = await Hive.openBox(boxName); // 打开 Hive Box 实例 } else { _box = Hive.box(boxName); // 如果已经打开,则获取实例 } return _instance; } //根据hive删除整个文件 Future<bool> deleteBox(String boxName) async { try { await Hive.deleteBoxFromDisk(boxName); return true; // 删除成功 } catch (e) { return false; // 删除失败 } } // 根据 key 删除数据,并返回删除是否成功 static Future<bool> deleteKey(String key) async { try { await _box.delete(key); // 验证键是否仍存在 bool isDeleted = !_box.containsKey(key); return isDeleted; } catch (e) { return false; // 删除失败 } } /// 根据 key 存储 int 类型 static Future<void> setInt(String key, int value) async { await _box.put(key, value); // 使用 Hive 存储 int 类型的数据 } /// 根据 key 获取 int 类型 static int? getInt(String key, {int defaultValue = 0}) { return _box.get(key, defaultValue: defaultValue); // 使用 Hive 获取 int 类型数据,如果不存在则返回默认值 } /// 根据 key 存储 double 类型 static Future<void> setDouble(String key, double value) async { await _box.put(key, value); // 使用 Hive 存储 double 类型的数据 } /// 根据 key 获取 double 类型 static double? getDouble(String key, {double defaultValue = 0.0}) { return _box.get(key, defaultValue: defaultValue); // 使用 Hive 获取 double 类型数据,如果不存在则返回默认值 } /// 根据 key 存储字符串类型 static Future<void> setString(String key, String value) async { await _box.put(key, value); // 使用 Hive 存储字符串类型的数据 } /// 根据 key 获取字符串类型 static String? getString(String key, {String defaultValue = ""}) { return _box.get(key, defaultValue: defaultValue); // 使用 Hive 获取字符串类型数据,如果不存在则返回默认值 } /// 根据 key 存储布尔类型 static Future<void> setBool(String key, bool value) async { await _box.put(key, value); // 使用 Hive 存储布尔类型的数据 } /// 根据 key 获取布尔类型 static bool? getBool(String key, {bool defaultValue = false}) { return _box.get(key, defaultValue: defaultValue); // 使用 Hive 获取布尔类型数据,如果不存在则返回默认值 } /// 根据 key 存储字符串类型数组 static Future<void> setStringList(String key, List<String> value) async { await _box.put(key, value); // 使用 Hive 存储字符串类型数组 } /// 根据 key 获取字符串类型数组 static List<String> getStringList(String key, {List<String> defaultValue = const []}) { return _box.get(key, defaultValue: defaultValue); // 使用 Hive 获取字符串类型数组,如果不存在则返回默认值 } /// 根据 key 存储 Map 类型 static Future<void> setMap(String key, Map<String, dynamic> value) async {
await _box.put( key, json.encode(value)); // 使用 Hive 存储 Map 类型的数据,将 Map 转为 json 字符串存储 } /// 根据 key 获取 Map 类型 static Map<String, dynamic> getMap(String key) {
String jsonStr = _box.get(key, defaultValue: ""); // 使用 Hive 获取存储的 json 字符串 return jsonStr.isEmpty ? {} : json.decode(jsonStr); // 将 json 字符串解码为 Map 对象,如果 json 为空则返回空 Map 对象 } }
初始化
WidgetsFlutterBinding.ensureInitialized(); //是 Flutter 中一个重要的函数,它确保 Flutter 框架在执行任何其他代码之前已完成初始化 // 初始化 Hive 并设置存储路径 await Hive.initFlutter(); // 打开默认的 Box await HiveUtil.getInstance('myBox'); // await HiveUtil.setInt("INT",13141); runApp(const MyApp()); }