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

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

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

概览

fbdb logo banner

fbdb是一个用于Firebird数据库管理系统的Dart客户端。它提供了基于future、异步方法和流的高层API,以及围绕原生Firebird客户端接口的低层包装。需要注意的是,使用该库需要有本地Firebird客户端库(根据操作系统不同,可能是fbclient.dlllibfbclient.solibfbclient.dylib)及其依赖项。

human made logo banner

Firebird名称和标志是Firebird Foundation的注册商标,经许可使用。

功能特性

  • 完全异步与Firebird数据库通信,非常适合Flutter GUI应用及服务器端Dart应用。
  • 提供两种选择:高层、符合Dart习惯的库,或低层原生Firebird客户端绑定。
  • 利用Dart高级概念如isolate、stream、future和FFI,同时提供给开发者简单便捷的接口。
  • 支持数据库事务和BLOBs。
  • 调用官方Firebird客户端动态库中的本地函数。
  • 免费使用且开源(BSD-3许可证)。

使用示例

简单查询示例

我们将编写一个简单的控制台应用程序来展示如何从名为employee的数据库中获取前10名员工的名字。

步骤1: 创建项目并添加依赖

dart create -t console fbdbtestproj
cd fbdbtestproj
dart pub add fbdb

步骤2: 编写代码

main.dart文件的内容替换为以下代码:

import "package:fbdb/fbdb.dart";

void main() async {
  // 连接到数据库,请确保正确填写host, user, password信息
  FbDb db = await FbDb.attach(
    host: "localhost", // 数据库主机地址
    database: "employee", // 数据库名称
    user: "SYSDBA", // 用户名
    password: "masterkey", // 密码
  );

  try {
    final q = db.query();
    await q.openCursor(
      sql: "select FIRST_NAME, LAST_NAME "
          "from EMPLOYEE "
          "order by LAST_NAME "
          "rows 10 ",
    );
    
    // 打印结果
    await for (var r in q.rows()) {
      print("${r['LAST_NAME']}, ${r['FIRST_NAME']}");
    }
  } finally {
    // 关闭资源
    await db.detach();
  }
}

步骤3: 添加必要的本地库

根据您的操作系统下载对应的Firebird客户端库,并将其放置在项目的根目录下。例如,在Windows上你需要fbclient.dll以及它的依赖文件(如msvcp140.dllvcruntime140.dll)。

步骤4: 运行程序

dart run

如果一切顺利,您应该会在控制台上看到如下输出:

Baldwin, Janet
Bender, Oliver H.
Bennet, Ann
Bishop, Dana
Brown, Kelly
Burbank, Jennifer M.
Cook, Kevin
De Souza, Roger
Ferrari, Roberto
Fisher, Pete

更多信息

文档与资源

强烈建议阅读FbDb程序员指南FbDb架构概述,以更好地理解如何使用此库。

此外,还有更多详细的例子可以在GitHub仓库找到,涵盖了从基本操作到更复杂的功能实现。

生成API文档

如果您想要生成API文档,可以克隆仓库并在根目录执行命令:

dart doc

生成的API文档将保存在docs/API子目录中。

结论

通过上述步骤,您已经成功地使用了fbdb插件连接到了Firebird数据库,并实现了基本的数据读取功能。随着对库的理解加深,您可以探索更多高级特性和最佳实践,从而构建更加复杂的数据库驱动的应用程序。如果有任何问题或者需要进一步的帮助,请参考官方提供的教程和其他资源。


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

1 回复

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


当然,以下是一个关于如何使用Flutter数据库管理插件fbdb的示例代码。fbdb是一个假想的插件名称,因为实际上并没有一个广泛知名的Flutter插件直接名为fbdb。然而,为了演示,我们将假设fbdb是一个SQLite数据库管理插件,因为SQLite是Flutter开发中常用的数据库之一。

在实际应用中,你可能会使用如sqflite这样的流行插件。但为了满足你的要求,我们将以fbdb为假设名称来编写代码。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加fbdb依赖(注意:这里fbdb是假设的,实际使用时请替换为真实的插件名,如sqflite):

dependencies:
  flutter:
    sdk: flutter
  fbdb: ^x.y.z  # 替换为实际版本号

然后运行flutter pub get来安装依赖。

2. 初始化数据库

在你的Flutter应用中,你需要初始化数据库并打开一个连接。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:fbdb/fbdb.dart'; // 假设的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late Database _db;

  @override
  void initState() {
    super.initState();
    _initializeDatabase();
  }

  Future<void> _initializeDatabase() async {
    // 打开数据库连接(如果数据库不存在,则创建一个新的)
    _db = await openDatabase(
      join(await getDatabasesPath(), 'demo.db'),
      onCreate: (db, version) async {
        // 在这里创建表
        await db.execute(
          'CREATE TABLE Users('
          'id INTEGER PRIMARY KEY,'
          'name TEXT NOT NULL,'
          'age INTEGER NOT NULL'
          ')',
        );
      },
      version: 1,
    );
  }

  // 其他业务逻辑...

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: Center(
        child: Text('Database initialized!'),
      ),
    );
  }
}

3. 插入数据

以下是如何在数据库中插入数据的示例:

Future<void> _insertData() async {
  // 插入一条新记录
  await _db.insert(
    'Users',
    {
      'name': 'Alice',
      'age': 30,
    },
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

4. 查询数据

以下是如何从数据库中查询数据的示例:

Future<List<Map<String, dynamic>>> _queryData() async {
  // 查询所有用户
  return await _db.query('Users');
}

5. 更新数据

以下是如何更新数据库中数据的示例:

Future<void> _updateData() async {
  // 更新用户的年龄
  await _db.update(
    'Users',
    {
      'age': 31,
    },
    where: 'id = ?',
    whereArgs: [1],
  );
}

6. 删除数据

以下是如何从数据库中删除数据的示例:

Future<void> _deleteData() async {
  // 删除用户
  await _db.delete(
    'Users',
    where: 'id = ?',
    whereArgs: [1],
  );
}

完整示例

将上述代码片段整合到一个完整的示例中:

import 'package:flutter/material.dart';
import 'package:fbdb/fbdb.dart'; // 假设的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late Database _db;

  @override
  void initState() {
    super.initState();
    _initializeDatabase();
  }

  Future<void> _initializeDatabase() async {
    _db = await openDatabase(
      join(await getDatabasesPath(), 'demo.db'),
      onCreate: (db, version) async {
        await db.execute(
          'CREATE TABLE Users('
          'id INTEGER PRIMARY KEY,'
          'name TEXT NOT NULL,'
          'age INTEGER NOT NULL'
          ')',
        );
      },
      version: 1,
    );
  }

  Future<void> _insertData() async {
    await _db.insert(
      'Users',
      {
        'name': 'Alice',
        'age': 30,
      },
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
  }

  Future<List<Map<String, dynamic>>> _queryData() async {
    return await _db.query('Users');
  }

  Future<void> _updateData() async {
    await _db.update(
      'Users',
      {
        'age': 31,
      },
      where: 'id = ?',
      whereArgs: [1],
    );
  }

  Future<void> _deleteData() async {
    await _db.delete(
      'Users',
      where: 'id = ?',
      whereArgs: [1],
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                await _insertData();
                print('Data inserted!');
              },
              child: Text('Insert Data'),
            ),
            ElevatedButton(
              onPressed: () async {
                final data = await _queryData();
                print('Data queried: $data');
              },
              child: Text('Query Data'),
            ),
            ElevatedButton(
              onPressed: () async {
                await _updateData();
                print('Data updated!');
              },
              child: Text('Update Data'),
            ),
            ElevatedButton(
              onPressed: () async {
                await _deleteData();
                print('Data deleted!');
              },
              child: Text('Delete Data'),
            ),
          ],
        ),
      ),
    );
  }
}

请注意,上述代码使用了假设的fbdb插件。在实际应用中,请替换为如sqflite这样的真实插件,并根据其文档调整代码。

回到顶部