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());
}

 

posted on 2024-07-24 11:05  鲤斌  阅读(197)  评论(0编辑  收藏  举报