Flutter数据库管理插件stash_sembast的使用
Flutter数据库管理插件stash_sembast的使用
概述
stash_sembast
是 stash
的一个存储扩展,它基于 sembast
提供了一个高性能的二进制序列化缓存存储。通过使用 msgpack
序列化格式,stash_sembast
能够高效地管理和存储缓存数据。
入门指南
1. 添加依赖
在你的 pubspec.yaml
文件中添加 stash_sembast
依赖,并将 x.x.x
替换为最新版本号:
dependencies:
stash_sembast: ^x.x.x
2. 安装依赖
运行以下命令来安装依赖:
dart pub get
3. 导入库
在你的 Dart 文件中导入 stash
和 stash_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
更多关于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
来创建一个简单的用户数据库,包括添加用户和读取用户列表的功能。你可以根据需求进一步扩展和修改这个示例。