我在项目中使用Hive - Package 在本地存储一些数据。到目前为止,一切都很好,但现在我面临一个问题:
我有一个Custom-Class其中也有一个字段与另一个Custom-Class:
part 'hive_vitals_interface.g.dart';
@HiveType(typeId: 1)
class HiveVitals extends HiveObject {
@HiveField(0)
String? id;
@HiveField(1)
DateTime? date;
@HiveField(2)
List<HiveDiscomfort> otherDiscomfort;
@HiveField(3)
List<HiveDiscomfort> mentalDiscomfort;
HiveVitals({
this.id,
this.date,
this.otherDiscomfort = const [],
this.mentalDiscomfort = const [],
});
}
Run Code Online (Sandbox Code Playgroud)
和我的HiveDiscomforts-Class:
part 'hive_discomfort_interface.g.dart';
@HiveType(typeId: 2)
class HiveDiscomfort extends HiveObject {
@HiveField(0)
String? title;
@HiveField(1)
int? intensity;
HiveDiscomfort({
this.title,
this.intensity,
});
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试这样保存: HiveVitals
static Future<void> addVitals(HiveVitals hiveVitals) async {
final vitalsBox = getVitalsBox(); …Run Code Online (Sandbox Code Playgroud) 我了解到,使用 flutter 中的 hive 数据库可以将自定义对象存储为 json 字符串。然后可以选择编写一个自定义类型适配器,以二进制格式存储数据。
那么,当开发人员只需以 json 字符串格式存储自定义对象时,为什么需要花费更多时间来实现类型适配器呢?
我使用Hive Packages,我在我的项目中实现了模块化。首先,我network使用运行命令创建名称为包的包flutter create --template=package network,我引用了这个。
这个包包括我的项目模型。之后我创建模型用户,然后运行命令构建模型flutter packages pub run build_runner build --delete-conflicting-outputs:
import 'package:hive/hive.dart';
part 'user_model_hive.g.dart';
@HiveType()
class UserModelHive extends HiveObject {
@HiveField(0)
DateTime id;
@HiveField(1)
String giverName;
@HiveField(2)
String pinCodeNumber;
UserModelHive({this.id, this.giverName, this.pinCodeNumber});
}
Run Code Online (Sandbox Code Playgroud)
但我得到这样的错误
Could not find package "build_runner". Did you forget to add a dependency? pub finished with exit code 65
我确定已经包含build_runner在我的包中network。
pubspec.yaml
name: network
description: A new Flutter package project.
version: 0.0.1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试访问一些在整个应用程序中更改和访问的用户设置。为此,我使用 Hive 从框中检索用户设置。我想通过将检索到的对象转换为UserSettings将Hive.box('settings').get(userID)被输入到StreamProvider.
我将如何变成Hive.box('settings').get(userID)一个流?
编辑:这是迄今为止我的代码实现:
本地数据库.dart
static Stream<UserSettings> get userSettings {
return Hive.box('settings').watch(key: userID)?.map((boxEvent) {
return boxEvent.value; // ========> value is always null from boxEvent
});
}
static void saveUserSettings(UserSettings userPref) {
Hive.box('settings').put(userID, userPref);
}
Run Code Online (Sandbox Code Playgroud)
主程序.dart
class Launch extends StatefulWidget {
@override
_LaunchState createState() => _LaunchState();
}
class _LaunchState extends State<Launch> {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
StreamProvider<User>.value(value: AuthService.user),
StreamProvider<UserSettings>.value(value: LocalDatabase.userSettings),
],
child: MaterialApp(
title: 'MyApp',
home: AuthWrapper(), …Run Code Online (Sandbox Code Playgroud) 我的问题是 flutter Hive 无法从多个隔离区打开。因此,我希望将 workmananger 任务中获取的数据发送到打开配置单元框的主隔离区,并在那里对其进行修改以避免损坏它。我应该考虑应用程序何时处于活动状态以及何时不存在 => 例如,当应用程序不处于活动状态时,我直接编辑配置单元文件,因为它只会在 workmanager 隔离中打开,而如果应用程序不处于活动状态,我会直接编辑配置单元文件将数据发送到主隔离并编辑配置单元文件。我的问题是,我不知道如何跟踪工作管理器任务中的生命周期,也不知道如何将数据发送到主隔离。该问题有任何解决方法或解决方案,或者如何对上述内容进行编码?
错误:Unhandled Exception: HiveError: You need to initialize Hive or provide a path to store the box.
本质上,我的依赖项中有这些,所以一切都应该很好。
hive: ^1.4.4+1
hive_flutter: ^0.3.1
path_provider: ^1.6.27
Run Code Online (Sandbox Code Playgroud)
我的文件中也有import 'package:hive/hive.dart';
和
import 'package:path_provider/path_provider.dart';
所以我只有
void doSomething() async {
final documentDirectory = await getApplicationDocumentsDirectory();
Hive.init(documentDirectory.path);
}
Run Code Online (Sandbox Code Playgroud)
叫。
我不明白。我想我所做的一切都是正确的。如果您还需要其他东西,请告诉我。
这可能是显而易见的,但有人可以告诉我如何使用 Android Studio 在 Flutter 应用程序中初始化 Hive 后找到我的 Hive Box 文件吗?
我已遵循此处的文档 - https://docs.hivedb.dev/#/README - 我的基本实现工作正常,但我找不到 Box 文件或任何与此相关的 Hive 文件的存储位置。
我希望能够在 Android Studio 中找到我的 Box(数据库)在我的项目中的位置,以便我可以查看数据库的内容并确认它存在于正确的位置
这是我的代码,我在其中初始化 Hive 并打开一个盒子
void main() async {
// Initialise Hive
await Hive.initFlutter('hiveusersfolder');
runApp(MyApp());
var box = await Hive.openBox('hiveusersfolder');
box.put('name', 'MyName');
print('Name: ${box.get('MyName')}');
}
Run Code Online (Sandbox Code Playgroud)
上面的代码存在于我的 main.dart 文件中
我在 Ubuntu 上使用 Android Studio。
*编辑更新
我已经找到了 Box 存储位置的假定路径,但是当使用 Android Studio Navigate > Search Everywhere 时 - 在此文件夹/路径中找不到任何内容。初始化我的数据库并将用户添加到框中后,我应该能够看到一个框文件并查看用户,就像使用任何其他类型的数据库一样,不是吗?
这是路径 /data/user/0/myappv1.myappv1/app_flutter
我尝试了无效缓存+重新启动,但仍然没有任何结果
如果问题出在 Android Studio 搜索上,如何在 Ubuntu 文件资源管理器上访问上述路径?或者使用命令行?
谁能告诉我如何在 Flutter 中存储和检索 Hive 数据库中的图像?
我想上传图像,然后使用配置单元在其他页面中显示图像,我尝试过,但无法做到这一点。
我正在使用这个包https://pub.dev/packages/hive
我想在配置单元中保存和检索自定义对象的列表。
我尝试过以下方法
await Hive.openBox<List<SourceStations>>(stationBox); //Open box
Box<List<SourceStations>> sourceStationsBox = Hive.box(stationBox);
sourceStationsBox.put(stationBox, listSourceStation); //Saving list of custom object as listSourceStation
//Should probably give lenght of list of custom object
logger.d('station box list length is ${sourceStationsBox.get(stationBox).length}');
Run Code Online (Sandbox Code Playgroud)
但我遇到了以下错误
E/flutter(24061):[错误:flutter/shell/common/shell.cc(199)] Dart错误:未处理的异常:E/flutter(24061):类型“List”不是类型“List”的子类型类型转换 E/flutter (24061): #0 BoxImpl.get (package:hive/src/box/box_impl.dart:43:26) E/flutter (24061): #1
_SourceToDestinationPageState.openStationBox
我已尝试检查此解决方案,但没有足够的想法来解决此问题。
以下是我使用的hive版本
这里是 Riverpod 的新手。(使用 Flutter 和 hooks_riverpod,顺便说一句)。
使用 Hive 存储相关的项目列表。我需要调用Hive.initFlutter并等待 Hive 初始化,并在我的应用程序加载时执行相同的操作来打开配置单元框。之后,对 Hive 的调用是同步的。
我最初的想法(尽管我愿意接受更好的想法)是创建一个包含两个列表的 StateNotifier。该通知程序可以有一个异步的 setUp 函数。简化后的样子如下:
class ItemsNotifier extends StateNotifier<ItemsState> {
ItemsNotifier() : super(ItemsState([], []));
setUp() async {
await Hive.initFlutter();
// What is ItemDao? It's a data accessor object singleton used to house Hive logic.
await ItemDao().openBoxes();
// Putting a breakpoint here, I can see by calling `ItemDao().list1` etc that the lists have loaded with items as expected, but setting state here does not trigger a rebuild …Run Code Online (Sandbox Code Playgroud)