Flutter高效数据存储与检索插件indexed_entity_store的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter高效数据存储与检索插件indexed_entity_store的使用

Indexed Entity Store

IndexedEntityStore 提供了快速、同步的数据持久化存储解决方案,适用于 Flutter 应用程序。

  • 💨 快速: 优化了数据访问和开发速度。
    • 使用热重载而不是代码生成,并且无需手动编写迁移脚本。
    • 所有查询都使用索引,因此数据访问总是即时的。
  • ⚡️ 反应式: 每次从存储中读取都是反应式的,所以当底层数据发生变化时,应用程序可以自动更新。
  • 📖 简单: 提供了一些易于使用的 API,并力求实现只有几百行代码的简单实现。

该库的主要目标是提高开发者在开发过程中的生产力。大多数应用只需要几千个或更少的实体类型,并且如果通过索引查询这些数据,则不需要进行任何简单的的数据更新。此外,不需要手动将实体映射到“行”。只需使用 toJsonfromJson 方法,这些方法很可能已经存在于你的类型中。

该库本身是在伯克利风格下开发的,这意味着其目标是使它在实际使用中非常友好,并且保持实现简单直接且小巧。虽然这可能会防止一些不错的功能,但最坏的情况是代码过于复杂或被废弃,无法轻松迁移到其他数据库设置。

因为这个库使用 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&lt;Todo, int /* key type */, String /* DB type */&gt;(
  entityKey: 'todo',
  getPrimaryKey: (t) =&gt; t.id,
  getIndices: (index) {
    index((t) =&gt; t.done, as: 'done');
  },
  serialize: (t) =&gt; jsonEncode(t.toJSON()),
  deserialize: (s) =&gt; Todo.fromJSON(
    jsonDecode(s) as Map&lt;String, dynamic&gt;,
  ),
);

更多关于Flutter高效数据存储与检索插件indexed_entity_store的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于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.'),
        ),
      ),
    );
  }
}

解释

  1. 数据模型定义User 类扩展了 IndexedEntity 并定义了索引字段 nameage
  2. 存储初始化:在 MyAppinitState 方法中,我们初始化了 IndexedEntityStore<User> 并指定了如何构造和序列化 User 对象。
  3. 数据操作:我们插入了一些用户数据,然后使用 findAll 方法检索所有用户,使用 findWhere 方法根据 nameage 字段检索特定用户。

运行这个示例代码,你应该会在控制台中看到存储和检索的数据。

希望这个示例能帮助你理解如何在 Flutter 应用中使用 indexed_entity_store 进行高效的数据存储与检索。

回到顶部