我如何从Hive Flutter获得数据?



我目前正在做一个项目,这是数独和UI和游戏页面的一切都完成了,除了数据库。问题是,当用户登录时,他可以玩游戏,但用户的数据没有被存储。登录信息存储在不同的模型中,我为游戏数据和注册信息创建了两个模型。它存储在本地。现在我需要将数据解析给用户,并需要在用户返回或应用程序重新启动时访问它。

我已经为游戏数据创建了一个模型,即

@HiveType(typeId: 0)
class GameDataModel extends HiveObject {
@HiveField(0)
final String star;
@HiveField(1)
final String avatar;
@HiveField(2)
final String saveGame;
GameDataModel({
required this.star,
required this.avatar,
required this.saveGame,
});

登录模式为

@HiveType(typeId: 1)
class LoginModel extends HiveObject {
@HiveField(0)
int? uid;
@HiveField(1)
final String username;
@HiveField(2)
final String password;
LoginModel({
this.uid,
required this.username,
required this.password,
});

现在我需要的是有星星,头像和游戏数据的用户。完成关卡后,我需要将收集到的星星存储到用户id中并保存。我怎么做呢?

您需要用它们的适配器和唯一的typeId初始化所有创建的模型。这是在main。dart中做的但其中一些是禁用的

Future<void> main() async {
await Hive.initFlutter();
// if (!Hive.isAdapterRegistered(LoginModelAdapter().typeId)) {
//   Hive.registerAdapter(LoginModelAdapter());
// }
//  if (!Hive.isAdapterRegistered(GameDataModelAdapter().typeId)) {
//   Hive.registerAdapter(GameDataModelAdapter());
// }
if(!Hive.isAdapterRegistered(UserModelAdapter().typeId)){
Hive.registerAdapter(UserModelAdapter());
}
allData = await Hive.openBox('user model');
//  gameDataDb = await Hive.openBox('user_db');
//  loginDb = await Hive.openBox('user_db');
runApp(const MyApp());
}

应该看起来像:

Future<void> main() async {
await Hive.initFlutter();
if (!Hive.isAdapterRegistered(LoginModelAdapter().typeId)) {
Hive.registerAdapter(LoginModelAdapter());
}
if (!Hive.isAdapterRegistered(GameDataModelAdapter().typeId)) {
Hive.registerAdapter(GameDataModelAdapter());
}
if(!Hive.isAdapterRegistered(UserModelAdapter().typeId)){
Hive.registerAdapter(UserModelAdapter());
}
allData = await Hive.openBox('user model');
//  gameDataDb = await Hive.openBox('user_db');
//  loginDb = await Hive.openBox('user_db');
runApp(const MyApp());
}

你也使用相同的类型id(1)为你的UserModel和你的gamedatmodel。因此,UserModelAdapter永远不会注册,您也无法存储任何数据。

将你的UserModel typeId从1改为2,它可以正常工作。

@HiveType(typeId: 1) ->@HiveType(类型id: 2)

将以下包添加到您的pubspec.yaml

dependencies:
flutter:
sdk: flutter
hive: ^2.2.3
hive_flutter: ^1.1.0
dev_dependencies:
flutter_test:
sdk: flutter
hive_generator: ^2.0.1
build_runner: ^2.2.0

接下来需要定义实体类

import 'package:hive_flutter/hive_flutter.dart';
part 'task_entity.g.dart';
@HiveType(typeId: 2)
class Task {
Task({required this.title, required this.content});
@HiveField(0)
String title;
@HiveField(1)
String content;
}

编写这部分代码part 'task_entity. g.t dart';这需要创建自定义类型类来存储数据。

下一步打开终端并写入flutter packages pub run build_runner build在终端工作结束时,您将看到自动生成的类

// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'task_entity.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class TaskAdapter extends TypeAdapter<Task> {
@override
final int typeId = 2;
@override
Task read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Task(
title: fields[0] as String,
content: fields[1] as String,
);
}
@override
void write(BinaryWriter writer, Task obj) {
writer
..writeByte(2)
..writeByte(0)
..write(obj.title)
..writeByte(1)
..write(obj.content);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is TaskAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

现在你必须定义适配器,它与你的自定义类配对。

void main() async {
await Hive.initFlutter();
Hive.registerAdapter<Task>(TaskAdapter());
await Hive.openBox<Task>('taskBox');
runApp(const MyApp());
} 

之后,一切都准备好存储自定义类。让我们看看最后一部分。

void _storeData(
{required String title, required String content}) async {
var box = Hive.box<Task>('taskBox');
Task task = Task(content: content, title: title);
await box.add(task);
}

已完成的ada作业.

最新更新