Flutter高效数据存储与检索插件indexed_entity_store的使用
Flutter高效数据存储与检索插件indexed_entity_store的使用
Indexed Entity Store
IndexedEntityStore 提供了快速、同步的数据持久化存储解决方案,适用于 Flutter 应用程序。
- 💨 快速: 优化了数据访问和开发速度。
- 使用热重载而不是代码生成,并且无需手动编写迁移脚本。
- 所有查询都使用索引,因此数据访问总是即时的。
- ⚡️ 反应式: 每次从存储中读取都是反应式的,所以当底层数据发生变化时,应用程序可以自动更新。
- 📖 简单: 提供了一些易于使用的 API,并力求实现只有几百行代码的简单实现。
该库的主要目标是提高开发者在开发过程中的生产力。大多数应用只需要几千个或更少的实体类型,并且如果通过索引查询这些数据,则不需要进行任何简单的的数据更新。此外,不需要手动将实体映射到“行”。只需使用 toJson
和 fromJson
方法,这些方法很可能已经存在于你的类型中。
该库本身是在伯克利风格下开发的,这意味着其目标是使它在实际使用中非常友好,并且保持实现简单直接且小巧。虽然这可能会防止一些不错的功能,但最坏的情况是代码过于复杂或被废弃,无法轻松迁移到其他数据库设置。
因为这个库使用 SQLite 同步地在同一线程中,所以可以很容易地混合 SQL 和 Dart 代码,而不会像异步数据库设置那样带来额外的开销(尤其是由于在语句之间可能发生变化)。这意味着开发者可以编写更简单、更可复用的查询,并将复杂的逻辑保留在 Dart 中。
以下是一个简单的示例,展示如何使用 IndexedEntityStore 创建一个待办事项列表应用。
class Todo {
final int id;
final String text;
final bool done;
Todo({required this.id, required this.text, required this.done});
// 这些很可能是由 [json_serializable] 或 [freezed] 自动生成的模型
Map<String, dynamic> toJSON() {
return {
'id': id,
'text': text,
'done': done,
};
}
static Todo fromJSON(Map<String, dynamic> json) {
return Todo(
id: json['id'],
text: json['text'],
done: json['done'],
);
}
}
final db = IndexedEntityDatabase.open('/tmp/appdata.sqlite3'); // 实际上应放在应用目录中
final todos = db.entityStore(todoConnector);
// 虽然在这里使用字符串列不是特别好,但这样可以避免代码生成并抛出错误
final openTodos = todos.query(where: (cols) => cols['done'].equals(false));
print(openTodos.value); // 第一次运行时打印空列表,因为还没有添加任何待办事项
todos.write(
Todo(id: 1, text: 'Publish new version', done: false),
);
print(openTodos.value); // 现在打印包含新添加的待办事项的列表
// `openTodos` 实际上在插入后立即更新,例如可以使用 `addListener` 来连接副作用以响应每次更改
openTodos.dispose(); // 当不再感兴趣于更新时取消订阅
上述代码省略了 todoConnector
的定义。这是告诉库如何将存储映射到实体类型的小小配置部分。对于待办任务来说,它可能看起来像这样:
final todoConnector = IndexedEntityConnector<Todo, int /* key type */, String /* DB type */>(
entityKey: 'todo',
getPrimaryKey: (t) => t.id,
getIndices: (index) {
index((t) => t.done, as: 'done');
},
serialize: (t) => jsonEncode(t.toJSON()),
deserialize: (s) => Todo.fromJSON(
jsonDecode(s) as Map<String, dynamic>,
),
);
更多关于Flutter高效数据存储与检索插件indexed_entity_store的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter高效数据存储与检索插件indexed_entity_store的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用 indexed_entity_store
插件在 Flutter 中实现高效数据存储与检索的示例代码。indexed_entity_store
是一个用于在 Flutter 应用中实现本地数据存储和检索的插件,支持索引和查询功能,非常适用于需要快速检索数据的场景。
首先,确保你已经在 pubspec.yaml
文件中添加了 indexed_entity_store
依赖:
dependencies:
flutter:
sdk: flutter
indexed_entity_store: ^最新版本号
然后,运行 flutter pub get
来获取依赖。
接下来,我们编写一个示例代码,展示如何使用 indexed_entity_store
进行数据存储和检索。
数据模型定义
首先,定义一个数据模型。这里我们定义一个简单的 User
模型。
import 'package:indexed_entity_store/indexed_entity_store.dart';
class User extends IndexedEntity {
final String id;
final String name;
final int age;
User({required this.id, required this.name, required this.age});
@override
List<IndexField> get indexFields => [
IndexField(name: 'name'),
IndexField(name: 'age'),
];
// 用于从Map反序列化为User对象
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'] as String,
name: json['name'] as String,
age: json['age'] as int,
);
}
// 用于将User对象序列化为Map
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'age': age,
};
}
}
存储和检索
接下来,我们编写一个示例代码,展示如何使用 indexed_entity_store
进行存储和检索。
import 'package:flutter/material.dart';
import 'package:indexed_entity_store/indexed_entity_store.dart';
import 'user_model.dart'; // 假设上面的User类定义在这个文件中
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late IndexedEntityStore<User> userStore;
@override
void initState() {
super.initState();
// 初始化存储
userStore = IndexedEntityStore<User>(
storeName: 'userStore',
entityConstructor: (Map<String, dynamic> json) => User.fromJson(json),
toJson: (User user) => user.toJson(),
);
// 打开存储
userStore.open().then((_) async {
// 清除所有现有数据(可选)
await userStore.clear();
// 插入数据
await userStore.insert(User(id: '1', name: 'Alice', age: 30));
await userStore.insert(User(id: '2', name: 'Bob', age: 25));
await userStore.insert(User(id: '3', name: 'Charlie', age: 35));
// 检索数据
List<User> allUsers = await userStore.findAll();
print('All Users: $allUsers');
List<User> usersByName = await userStore.findWhere('name', isEqualTo: 'Alice');
print('Users Named Alice: $usersByName');
List<User> usersByAge = await userStore.findWhere('age', isGreaterThan: 30);
print('Users Older Than 30: $usersByAge');
}).catchError((error) {
print('Error: $error');
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Indexed Entity Store Example'),
),
body: Center(
child: Text('Check the console for stored and retrieved data.'),
),
),
);
}
}
解释
- 数据模型定义:
User
类扩展了IndexedEntity
并定义了索引字段name
和age
。 - 存储初始化:在
MyApp
的initState
方法中,我们初始化了IndexedEntityStore<User>
并指定了如何构造和序列化User
对象。 - 数据操作:我们插入了一些用户数据,然后使用
findAll
方法检索所有用户,使用findWhere
方法根据name
和age
字段检索特定用户。
运行这个示例代码,你应该会在控制台中看到存储和检索的数据。
希望这个示例能帮助你理解如何在 Flutter 应用中使用 indexed_entity_store
进行高效的数据存储与检索。