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 得到了支持,但去除了 ObservationObserverObserverChanges 类。这些接口在 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

1 回复

更多关于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应用中管理本地数据库。

回到顶部