FlutterIsar字符串ID

ohtdti5x  于 2023-03-19  发布在  Flutter
关注(0)|答案(2)|浏览(136)

我的应用程序有字符串ID的所有实体(服务器端)我想从Hive迁移到Isar,所以我正在阅读Isar documentation,并发现它不支持String ID(只有int),是的,我知道我可以创建这样的类:

@Collection()
class Student {
  int? id;
  @Index(unique: true)
  String? myServerId;
  late String name;
  final teacher = IsarLink<Teacher>();
}

当我获取数据时(JSON)从服务器返回id字段(Isar的经理)不是来自服务器,因此我将此记录保存在本地Isar将创建ID确定,下次我从服务器获取相同记录时,需要通过myServerId进行检查,如果存在,只需使用Isar创建的id进行更新,这很简单,我如何能管理它与所有实体字段一样teacher?需要检查每个实体的孩子或有一个更好的方法?提前感谢

nhn9ugyo

nhn9ugyo1#

replace设置为myServerId@Index中的true,如下所示:

@Collection()
class Student {
  int? id;
  @Index(unique: true , replace:true)
  String? myServerId;
  late String name;
  final teacher = IsarLink<Teacher>();
}

检查此Isar替换索引文档。

t1rydlwq

t1rydlwq2#

在项目中导入Dart语言的FNV哈希算法。

flutter pub add fnv

FNV(Fowler-Noll-Vo)散列函数是Isar数据库作者推荐的64位快速散列算法。
由于Id属性是必需的,我们将通过向其传递字符串id,将Id属性设置为使用算法生成的64位。
首先将包导入到集合类。

import 'package:fnv/fnv.dart';

然后定义Id属性,如下所示:

Id get isarId => fnv1a_32_s("YOUR STRING ID");

并保留您的String id以及一个单独的属性。
整个集合类将如下所示:

import 'package:fnv/fnv.dart';

@Collection()
class Student {
  @Index(unique: true, replace: true)
  String? myServerId;
  Id get isarId => fnv1a_32_s(myServerId);
  late String name;
  final teacher = IsarLink<Teacher>();
}

相关问题