Flutter数据库管理插件indexed_db的使用
Flutter数据库管理插件indexed_db的使用
简介
indexed_db
是一个用于在Flutter应用中进行数据库管理的插件。它是一个替代 dart:indexed_db
的包,基于 package web
而不是 dart:html
。
该插件的主要目的是作为 dart:indexed_db
库的直接替换品,因为后者不支持编译为WASM。因此,它实现了与 dart:indexed_db
相同的API,并且增加了一些方便使用的功能。
完整的 dart:indexed_db
API 得到了支持,但去除了 Observation
、Observer
和 ObserverChanges
类。这些接口在 package web
中不再受支持,但这不会影响任何基本的 indexed_db
功能。
使用示例
以下是一个简单的示例,展示了如何使用 indexed_db
插件创建数据库和对象存储,并进行数据的写入和读取操作。
/*
* Package : indexed_db
* Author : S. Hamblett <steve.hamblett@linux.com>
* Date : 18/12/2024
* Copyright : S.Hamblett - updates only
*/
import 'dart:js_interop';
import 'package:indexed_db/indexed_db.dart' as idb;
const storeName = 'IDBTestStore';
const int version = 1;
void printValues(String message, dynamic key, dynamic value) =>
print('EXAMPLE - $message - Key $key, Value $value');
///
/// An example of how to create a database and object store for simple key/value storage and retrieval.
/// Use for simple index_db use cases where more advanced functionality such as indexes etc. is not
/// needed.
void main() async {
var dbName = 'IDBTestDatabase';
final factory = idb.IdbFactory();
print('');
print('EXAMPLE - Start');
print('');
// 删除任何现有的数据库。
factory.deleteDatabase(dbName);
print('EXAMPLE - Deleted database');
// 打开数据库并创建对象存储。
// 与 `factory.open` 方法相比,这里不需要提供版本更改回调。
final result = await factory.openCreate(dbName, storeName);
final database = result.database;
print(
'EXAMPLE - Created new database and object store, database is $dbName, store is $storeName');
// 所有的数据库更新和检索必须在事务上下文中执行。
// 使用从数据库获得的事务来写入一些值。
// 我们正在更新数据库,所以事务模式为 'readwrite'。
var transaction = database.transactionList([storeName], 'readwrite');
print('');
print('EXAMPLE - Writing values');
print('');
printValues('Writing', 'String', 'Value');
transaction.objectStore(storeName).put('Value', 'Key');
printValues('Writing', 'Int', 10);
transaction.objectStore(storeName).put(10, 'Int');
printValues('Writing', 'List', [1, 2, 3]);
transaction.objectStore(storeName).put([1, 2, 3], 'List');
printValues('Writing', 'Map', {'first': 1, 'second': 2});
// 将映射转换为Js格式以便存储
transaction
.objectStore(storeName)
.put({'first': 1, 'second': 2}.jsify(), 'Map');
printValues('Writing', 'Bool', true);
transaction.objectStore(storeName).put(true, 'Bool');
// 等待事务完成后再继续。
await transaction.completed;
// 检查值,同样使用从数据库获得的事务。
// 我们正在读取数据库,所以事务模式为 'readonly'。
transaction = database.transactionList([storeName], 'readonly');
print('');
print('EXAMPLE - Reading values');
print('');
var value = await transaction.objectStore(storeName).getObject('Key');
printValues('Reading', 'String', value);
value = await transaction.objectStore(storeName).getObject('Int');
printValues('Reading', 'Int', value);
value = await transaction.objectStore(storeName).getObject('List');
printValues('Reading', 'List', value);
// 当检索时将映射转换回Dart格式
JSObject valueMap = await transaction.objectStore(storeName).getObject('Map');
final readMap = valueMap.dartify() as Map;
printValues('Reading', 'Map', readMap);
value = await transaction.objectStore(storeName).getObject('Bool');
printValues('Reading', 'Bool', value);
// 关闭数据库
print('EXAMPLE - Closing Database');
database.close();
print('');
print('EXAMPLE - Complete');
}
更多关于Flutter数据库管理插件indexed_db的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库管理插件indexed_db的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,虽然indexed_db
本身是一个Web标准的数据库API,通常用于浏览器环境中,但Flutter的跨平台特性使得我们不能直接在Flutter移动端或桌面应用中直接使用它。不过,Flutter社区已经开发了一些插件来简化数据库操作,其中一些插件提供了类似的功能。
为了在Flutter中实现类似indexed_db
的功能,我们通常会使用sqflite
(用于SQLite数据库)或floor
(一个基于sqflite
的ORM库)等插件。虽然这些不是indexed_db
的直接替代品,但它们提供了强大的本地存储解决方案。
下面我将给出一个使用sqflite
在Flutter中管理数据库的基本示例。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加sqflite
依赖:
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0+4 # 请检查最新版本号
2. 创建数据库助手类
接下来,创建一个数据库助手类来管理数据库的打开、关闭以及基本的CRUD操作。
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DatabaseHelper {
static Database? _db;
static Future<Database> get db async {
if (_db != null) return _db!;
_db = await openDatabase(
join(await getDatabasesPath(), 'my_database.db'),
onCreate: (db, version) async {
await db.execute(
'CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
);
},
version: 1,
);
return _db!;
}
Future<void> insertUser(String name, int age) async {
final db = await db;
await db.insert(
'users',
{'name': name, 'age': age},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
Future<List<Map<String, dynamic>>> getUsers() async {
final db = await db;
final List<Map<String, dynamic>> result = await db.query('users');
return result;
}
Future<void> updateUser(int id, String name, int age) async {
final db = await db;
await db.update(
'users',
{'name': name, 'age': age},
where: 'id = ?',
whereArgs: [id],
);
}
Future<void> deleteUser(int id) async {
final db = await db;
await db.delete(
'users',
where: 'id = ?',
whereArgs: [id],
);
}
}
3. 使用数据库助手类
现在,你可以在你的Flutter应用中使用这个数据库助手类来执行数据库操作。
import 'package:flutter/material.dart';
import 'database_helper.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Database Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late Future<List<Map<String, dynamic>>> users;
@override
void initState() {
super.initState();
DatabaseHelper.db.then((db) {
db.insertUser('Alice', 30);
db.insertUser('Bob', 25);
});
users = fetchUsers();
}
Future<List<Map<String, dynamic>>> fetchUsers() async {
final dbHelper = DatabaseHelper();
return dbHelper.getUsers();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Database Demo'),
),
body: FutureBuilder<List<Map<String, dynamic>>>(
future: users,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
final user = snapshot.data![index];
return ListTile(
title: Text('${user['name']} (${user['age']})'),
);
},
);
} else {
return CircularProgressIndicator();
}
},
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
final dbHelper = DatabaseHelper();
dbHelper.insertUser('Charlie', 28);
setState(() {
users = fetchUsers();
});
},
tooltip: 'Add User',
child: Icon(Icons.add),
),
);
}
}
这个示例展示了如何使用sqflite
在Flutter应用中创建、插入、查询和显示用户数据。虽然这不是indexed_db
,但它提供了一个类似的功能集,用于在Flutter应用中管理本地数据库。