Flutter数据库管理插件stash_sembast的使用

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

Flutter数据库管理插件stash_sembast的使用

概述

stash_sembaststash 的一个存储扩展,它基于 sembast 提供了一个高性能的二进制序列化缓存存储。通过使用 msgpack 序列化格式,stash_sembast 能够高效地管理和存储缓存数据。

入门指南

1. 添加依赖

在你的 pubspec.yaml 文件中添加 stash_sembast 依赖,并将 x.x.x 替换为最新版本号:

dependencies:
  stash_sembast: ^x.x.x

2. 安装依赖

运行以下命令来安装依赖:

dart pub get

3. 导入库

在你的 Dart 文件中导入 stashstash_sembast 库:

import 'package:stash/stash_api.dart';
import 'package:stash_sembast/stash_sembast.dart';

使用示例

1. Vault 示例

下面是一个创建带有 sembast 存储后端的 Vault 的示例。在这个简单的例子中,对象的序列化和反序列化是手动编写的,但通常可以依赖像 json_serializable 这样的库来处理。

import 'dart:io';

import 'package:stash/stash_api.dart';
import 'package:stash_sembast/stash_sembast.dart';

// 定义一个 Task 类
class Task {
  final int id;
  final String title;
  final bool completed;

  Task({required this.id, required this.title, this.completed = false});

  // 从 JSON 地图创建 Task 对象
  factory Task.fromJson(Map<String, dynamic> json) => Task(
      id: json['id'] as int,
      title: json['title'] as String,
      completed: json['completed'] as bool);

  // 将 Task 对象转换为 JSON 地图
  Map<String, dynamic> toJson() =>
      <String, dynamic>{'id': id, 'title': title, 'completed': completed};

  [@override](/user/override)
  String toString() {
    return 'Task $id, "$title" is ${completed ? "completed" : "not completed"}';
  }
}

void main() async {
  // 创建临时路径
  final dir = Directory.systemTemp;
  // 创建临时数据库文件
  final path = '${dir.path}/stash_sembast.sdb';

  // 创建存储
  final store = await newSembastLocalVaultStore(path: path);

  // 创建一个名为 'vault' 的 Vault
  final vault = await store.vault<Task>(
      name: 'vault',
      fromEncodable: (json) => Task.fromJson(json),
      eventListenerMode: EventListenerMode.synchronous)
    ..on<VaultEntryCreatedEvent<Task>>().listen(
        (event) => print('Key "${event.entry.key}" added to the vault'));

  // 向 Vault 中添加一个任务
  await vault.put(
      'task1', Task(id: 1, title: 'Run vault store example', completed: true));
  // 从 Vault 中检索值
  print(await vault.get('task1'));
  // 关闭 Vault
  vault.close();
}

2. Cache 示例

下面是一个创建带有 sembast 存储后端的 Cache 的示例。同样,对象的序列化和反序列化是手动编写的,但通常可以依赖像 json_serializable 这样的库来处理。

import 'dart:io';

import 'package:stash/stash_api.dart';
import 'package:stash_sembast/stash_sembast.dart';

// 定义一个 Task 类
class Task {
  final int id;
  final String title;
  final bool completed;

  Task({required this.id, required this.title, this.completed = false});

  // 从 JSON 地图创建 Task 对象
  factory Task.fromJson(Map<String, dynamic> json) => Task(
      id: json['id'] as int,
      title: json['title'] as String,
      completed: json['completed'] as bool);

  // 将 Task 对象转换为 JSON 地图
  Map<String, dynamic> toJson() =>
      <String, dynamic>{'id': id, 'title': title, 'completed': completed};

  [@override](/user/override)
  String toString() {
    return 'Task $id, "$title" is ${completed ? "completed" : "not completed"}';
  }
}

void main() async {
  // 创建临时路径
  final dir = Directory.systemTemp;
  // 创建临时数据库文件
  final path = '${dir.path}/stash_sembast.sdb';

  // 创建存储
  final store = await newSembastLocalCacheStore(path: path);

  // 创建一个名为 'cache1' 的 Cache,最大容量为 10
  final cache = await store.cache<Task>(
      name: 'cache1',
      fromEncodable: (json) => Task.fromJson(json),
      maxEntries: 10,
      eventListenerMode: EventListenerMode.synchronous)
    ..on<CacheEntryCreatedEvent<Task>>().listen(
        (event) => print('Key "${event.entry.key}" added to the cache'));

  // 向 Cache 中添加一个任务
  await cache.put(
      'task1', Task(id: 1, title: 'Run cache store example', completed: true));
  // 从 Cache 中检索值
  print(await cache.get('task1'));
  // 关闭 Cache
  cache.close();
}

更多关于Flutter数据库管理插件stash_sembast的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库管理插件stash_sembast的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用stash_sembast数据库管理插件的示例代码。stash_sembast 是一个功能强大的Flutter插件,用于在移动设备上管理SQLite数据库。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加stash_sembast的依赖:

dependencies:
  flutter:
    sdk: flutter
  stash_sembast: ^3.0.0  # 请检查最新版本号

2. 导入包

在你的Dart文件中导入必要的包:

import 'package:flutter/material.dart';
import 'package:stash_sembast/stash_sembast.dart';
import 'package:stash_sembast/stash_sembast_web.dart';  // 如果你在Web平台上运行

3. 初始化数据库

初始化数据库并打开一个存储(store):

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // Initialize Sembast
  final database = await openDatabase({
    'name': 'my_database.db',
    'version': 1,
  });

  // Open a store
  final store = StoreRef.mainStore(database);

  runApp(MyApp(database, store));
}

4. 创建数据模型

定义一个简单的数据模型:

class User {
  final int id;
  final String name;
  final String email;

  User(this.id, this.name, this.email);

  // Convert a User object to a Map for storing in the database
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'email': email,
    };
  }

  // Convert a Map back to a User object
  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      map['id'] as int,
      map['name'] as String,
      map['email'] as String,
    );
  }
}

5. 添加和读取数据

实现添加和读取数据的功能:

class MyApp extends StatelessWidget {
  final Database database;
  final StoreRef<int, Map<String, dynamic>> store;

  MyApp(this.database, this.store);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Sembast Example'),
        ),
        body: Center(
          child: MyHomePage(database, store),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final Database database;
  final StoreRef<int, Map<String, dynamic>> store;

  MyHomePage(this.database, this.store);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _emailController = TextEditingController();

  void _addUser() async {
    final user = User(
      1,  // Assuming a fixed ID for simplicity, in real use case generate a unique ID
      _nameController.text,
      _emailController.text,
    );

    await widget.store.record(user.id).put(widget.database, user.toMap());

    setState(() {
      // Reset controllers
      _nameController.clear();
      _emailController.clear();
    });
  }

  Future<List<User>> _getUsers() async {
    final finder = Finder(sortOrders: [SortOrder('id', ascending: true)]);
    final records = await widget.store.findRecords(widget.database, finder);
    return records.map((record) => User.fromMap(record.value)).toList();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        TextField(
          controller: _nameController,
          decoration: InputDecoration(labelText: 'Name'),
        ),
        TextField(
          controller: _emailController,
          decoration: InputDecoration(labelText: 'Email'),
        ),
        ElevatedButton(
          onPressed: _addUser,
          child: Text('Add User'),
        ),
        FutureBuilder<List<User>>(
          future: _getUsers(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else {
              final users = snapshot.data ?? [];
              return ListView.builder(
                itemCount: users.length,
                itemBuilder: (context, index) {
                  final user = users[index];
                  return ListTile(
                    title: Text('${user.name} (${user.email})'),
                  );
                },
              );
            }
          },
        ),
      ],
    );
  }
}

6. 运行应用

确保你已经连接了一个物理设备或启动了一个模拟器,然后运行flutter run命令来启动你的Flutter应用。

这个示例展示了如何使用stash_sembast来创建一个简单的用户数据库,包括添加用户和读取用户列表的功能。你可以根据需求进一步扩展和修改这个示例。

回到顶部