如何在 Flutter 移动应用中本地存储和访问数据? — 第二部分

这篇文章是我之前文章的延续。作为本地存储主题的延续,我将在本文中描述另外两种方法。我之前已经解释过共享首选项、读写文件和 Sqlite。在本文中,我将解释 Hive 和 Objectbox。如果您想阅读第一篇文章,请点击这里。
蜂巢

Hive 是一个轻量级且快速的键值对数据库解决方案,它是跨平台的(在移动设备、桌面和 Web 上运行)并且是用纯 Dart 编写的。这使它比不支持 Flutter web 的sqflite具有立竿见影的优势——Hive 具有任何原生依赖项,因此它可以在 web 上无缝运行。
如果要使用 Hive,则必须将依赖项添加到 pubspec.yaml。
依赖项:
蜂巢:^2.2.3
蜂巢_flutter:^1.1.0
初始化 Hive
在继续进行数据库的 CRUD 操作之前,初始化 Hive 并打开一个用于存储数据的框。
Hive 应该在我们加载任何盒子之前进行初始化,因此在 Flutter 应用程序的main()函数中初始化它以避免任何错误是一个聪明的主意。请注意,如果您在非 Flutter 纯 Dart 应用程序中使用 Hive,请使用Hive.init()来初始化 Hive。
主要()异步{
// 初始化蜂巢
等待 Hive.initFlutter();
运行应用程序(我的应用程序());
}
型适配器
一般来说,Hive 支持所有原始类型,如List、Map、DateTime和Uint8List。但有时您可能需要存储使数据管理更容易的自定义模型类。
TypeAdapter 可以手动编写或自动生成。使用代码生成来生成所需的方法总是更好,因为它有助于防止手动编写时可能发生的任何错误(而且速度更快)。
要为类生成类型适配器,请使用 @HiveType 注释它,并使用 @HiveField 注释 HiveType 必须具有 typeid 并且 HiveField 具有 unique 编号。这些字段编号用于标识 Hive 二进制格式的字段,并且一旦您的类在使用中就不应更改。
导入 'package:hive/hive.dart';part 'person.g.dart';@HiveType(typeId: 1)
类人{
@HiveField(0)
字符串名称; @HiveField(1)
年龄; @HiveField(2)
列出<Person> 朋友;
}
蜂巢箱
Hive 将其数据存储在包含键值集的框中。我喜欢将框视为一个组织者,其中的文件由编号框架列出和排列,或者作为 dart 中的法线贴图。使用 hive,在您可以读取/编写数据之前,应该打开一个框。可以使用 await Hive 打开盒子。Openbox(‘name’) 可以使用 Hive 获取打开的盒子的实例。 Box (‘name’),其中 ‘name’ 是案例的名称(即 DB 名称)。
Hive 存储对所有打开框的引用。如果你想得到一个已经打开的盒子,你可以使用
var box u003d Hive.box('myBox');
Hive CRUD
创建
// 创建新项目
Future<void> _createItem(Map<String, dynamic> newItem) async { await _shoppingBox.add(newItem);
_refreshItems(); // 更新用户界面
}
阅读
地图<字符串,动态> _readItem(int key) {
最后一项 u003d _shoppingBox.get(key);
归还物品; }
更新
Future<void> _updateItem(int itemKey, Map<String, dynamic> item) async {
等待 _shoppingBox.put(itemKey, item);
_refreshItems(); // 更新用户界面
}
删除
未来<void> _deleteItem(int itemKey) async {
等待 _shoppingBox.delete(itemKey);
_refreshItems();
对象框

与 Hive 类似,Objectbox是一个 Dart-native key-value 数据库。它速度极快,提高了响应率,并支持实时应用程序。该数据库支持 Android、iOS、macOS、Linux 和 Windows,并提供内置的对象链接/关系。 Flutter 中的 Objectbox 是一个非常快速的 NoSQL 数据库,针对移动设备上的极高性能进行了优化。它非常轻巧,可以在其中存储所有对象。
Objectbox 还很年轻,需要时间来成熟并在大型项目中经过实战考验。
初始化对象框
如果要使用 Objectbox,则必须将依赖项添加到 pubspec.yaml。
依赖项:
对象框:^0.11.0
objectbox_flutter_libs:任意
路径提供者:^1.6.27
开发_依赖项:
构建_runner:^1.0.0
objectbox_generator: 任意
首先我们应该创建我们的模型类。 id 不会添加到构造函数中,因为 id 的值将由 objectbox 动态分配。
类对象框 {
最终字符串名称;
int id;/// 两个盒子:一个用于任务,一个用于标签。
最终框<任务>任务框;
最终框<tag> tagBox;
ObjectBox({this.name,this.taskBox, this.tagBox })}
在这里,我们可以插入对象框的名称和他的所有详细信息,并且在他的 id 的帮助下,我们还可以删除和更新这些详细信息。
下面有创建、删除、插入和更新的参考代码。
CRUD 操作
创建
我们定义了添加新任务和标签的方法。首先使用输入控制器创建一个任务。然后,通过调用 tag.target() 设置我们想要与此任务相关的标签。现在我们只需要将新创建的 Task 对象放入它的 Box 中。
任务task u003d Task(_taskInputController.text);
task.tag.target u003d tagToAdd;
objectbox.taskBox.put(任务);
读
阅读
要获取所有标签名称,我们在 tagBox 上调用 getAll()。这将返回一个包含所有标签的列表。如果您只想读取单个对象,请调用 get(id) 方法以仅获取所需的单个对象。对于一系列对象,使用 getMany(),将 id 列表传递给它。
List<Tag> 标签 u003d objectbox.tagBox.getAll();
更新
我们的应用程序将所有任务打印为带有复选框的列表。每个任务的完成日期最初设置为空。我们希望在用户将任务标记为完成时更新任务的完成日期。因此,非空的完成日期将作为任务完成的指示器。让我们在 Checkbox 类的 onChanged 属性的 setState() 方法中执行此操作。如果更改复选框值时 dateFinished 为 null,则将 dateFinished 设置为 DateTime.now(),否则设置回 null。
复选框(
值:notNull(任务[索引].dateFinished),
onChanged: (bool?value) {
设置状态((){
if (!not Null(tasks[index].date Finished)) {
任务[索引].dateFinished u003d DateTime.now();
} 别的 {
任务[索引].dateFinished u003d null;
}
});
}
)
删除
为了从数据库中删除对象,我们添加了一个可关闭的 Flutter 小部件。在 onDismissed 属性的 setState 方法中,我们简单地使用 ObjectBox remove() 操作和相应的任务 id。
可解雇(
...
onDismissed:(方向){
// 从存储中删除任务。
objectbox.taskBox.remove(tasks[index].id);
setState(() {});
...
},
),
结论
在本文中,我已经解释了 Flutter 中本地存储的基础知识。这是对本地存储的一个小介绍。我希望这篇博客能给你提供足够的关于本地存储的信息。
参考
[
Hive 文档
说明
docs.hivedb.dev
](https://docs.hivedb.dev/#/)
[
如何开始在 Flutter 中使用 ObjectBox 数据库
还记得我们在第一部分初始化了一个 To One 关系,并计划在最后回到这个吗?现在...
对象框.io
](https://objectbox.io/crud-flutter-database/)
[
对象框|飞镖包
入门 * 文档 * 示例应用程序 * 问题 ObjectBox Flutter 数据库是存储 Dart... 的绝佳选择
发布开发
](https://pub.dev/packages/objectbox)
更多推荐

所有评论(0)