HiveError: Cannot read, unknown typeId: 32.你忘记注册适配器了吗?



我正在尝试创建一个尝试Hive数据库,并面临一些我无法解决的问题。

my model is

@HiveType(typeId: 1)
class Tasks {
@HiveField(0)
final String task;
@HiveField(1)
final bool isCompleted;
Tasks({required this.task, required this.isCompleted});
}

和hive_generator

生成的文件
class TasksAdapter extends TypeAdapter<Tasks> {
@override
final int typeId = 1;
@override
Tasks read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Tasks(
task: fields[0] as String,
isCompleted: fields[1] as bool,
);
}
@override
void write(BinaryWriter writer, Tasks obj) {
writer
..writeByte(2)
..writeByte(0)
..write(obj.task)
..writeByte(1)
..write(obj.isCompleted);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is TasksAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

in mymain():

Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final directory = await getApplicationDocumentsDirectory();
Hive.init(directory.path);
Hive.registerAdapter(TasksAdapter());
await Hive.openBox<Tasks>("TheList");
runApp(const MyApp());
}

我也尝试了lazy open,但在调试中显示了同样的错误。

我安装的依赖项是:hive: ^2.0.4hive_flutter: ^1.1.0path_provider: ^2.0.5build_runner: ^2.1.2hive_generator: ^ 1.1.1

我注意到当我改变一个typeId时也发生了同样的情况。我通过从手机中删除应用程序并重新运行它来解决我的问题,有点像清除缓存。

解决方案是用hive_flutter包中的Hive.initFlutter();替换Hive.init();

所以,代码应该是:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final document = await getApplicationDocumentsDirectory();
await Hive.initFlutter(document.path);
Hive.registerAdapter(TodoAdapter());
await Hive.openBox<Todo>('todos');
runApp(const MyApp());
}

出现这个错误有几个原因。首先,我将尝试导入hive_flutter:

import 'package:hive_flutter/hive_flutter.dart';

然后在打开任何盒子之前调用await Hive.initFlutter();

还可以将registerAdapter调用包装在if语句中:

if (!Hive.isAdapterRegistered(1)) {
Hive.registerAdapter(TasksAdapter());
}

清理Flutter项目解决了我的问题。

在操作菜单中:Tools ->颤振→颤振清洁

Hive.initFlutter();但是

在我的例子中,我有类composition

和i缺失添加适配器B

@HiveType(typeId: 1)
class A{. B data;}
@HiveType(typeId: 2)
class B{
}

在我的情况下,问题是我在注册类型适配器之前打开了一个Hive box。根据Hive的官方文档:

建议在打开任何盒子之前注册所有TypeAdapters

我在另一个分支中引入了两个不同的适配器,并在那里注册了它们。在我切换到另一个分支(其中适配器不存在)并运行代码之后。它给了我这个错误,因为它还在寻找其他类型id。快速解决方法是删除应用从设备/模拟器中重新运行应用程序,因为它将清除存储。

你可以试试下面的代码

Hive.deleteFromDisk()

box.clear()

如果您感兴趣,您还可以使用以下命令执行迁移:

Hive.box("myBox", version: 5, 
migrator: (oldVersion, newVersion, box) async {
await box.delete("unusedKey");
await box.put("newKey", 7);
});

尝试从设备中删除应用程序并重新安装以解决我的问题

在main中注册HiveAdapter。飞镖,砰!

Hive.registerAdapter(WeekendDayCollectionAdapter());

如何使用Hive进行颤振本地数据存储

Hive是一个流行的用于Flutter的NoSQL数据库包,它提供了快速高效的本地数据存储。当你需要在你的Flutter应用程序中本地持久化数据时,它特别有用。这里是如何开始使用Hive的分步指南:
  1. 初始化Hive和注册适配器:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();

final directory = await getApplicationDocumentsDirectory();
Hive.init(directory.path);
// Register the adapter for your model class
Hive.registerAdapter(TasksAdapter());
// Open a Hive box for your model class
Box<Tasks> tasksBox = await Hive.openBox<Tasks>("TheList");

runApp(const MyApp());
}
  1. 定义模型/模式类:

首先,用必要的注释定义模型或模式类:

class Tasks {
@HiveField(0)
late String taskName;
@HiveField(1)
late bool isCompleted;
}
  1. 使用Hive Box:

现在你可以在你的小部件中与Hive box进行交互了:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Hive Example',
home: Scaffold(
appBar: AppBar(title: Text('Hive Example')),
body: Center(
child: ElevatedButton(
onPressed: () {
// Example: Add a task to the tasksBox
final newTask = Tasks()
..taskName = 'Example Task'
..isCompleted = false;

tasksBox.add(newTask);
},
child: Text('Add Task'),
),
),
),
);
}
}
  1. 使用Hive with example_class Class:

如果您有一个名为ExampleClass的类,请遵循类似的方法:

await Hive.initFlutter();
Hive.registerAdapter(ExampleClassAdapter());
Box<ExampleClass> exampleClassBox = await Hive.openBox<ExampleClass>('example-class');

记住用你实际的类名替换ExampleClass。

通过以下步骤,您可以有效地在您的Flutter应用程序中使用Hive进行本地数据存储。不要忘记查看官方Hive文档,了解更多高级功能和最佳实践!

参考:一个使用Hive的组织良好的数据提供程序包,您可以参考以下GitHub存储库:https://github.com/devstroop/eatery_db

You can copy and paste the above content as your Stack Overflow post. Just make sure to replace the example class names and adapt the text according to your specific use case. Also, ensure that you tag the post with appropriate tags to reach the right audience.
  1. typeId从0开始,不是1
  2. 从移动设备上删除应用程序并重新运行flutter worked for m

相关内容

  • 没有找到相关文章

最新更新