Flutter数据库操作插件sqflite_common_ffi的使用

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

Flutter数据库操作插件sqflite_common_ffi的使用

sqflite_common_ffi是基于sqflitesqlite3的一个FFI(Foreign Function Interface)实现,它允许你在Flutter项目中更灵活地操作SQLite数据库。该插件在Linux、MacOS和Windows上都可以工作,并且可以在iOS和Android平台上通过sqlite3_flutter_libs来使用。

一、开始之前

添加依赖

首先,在你的pubspec.yaml文件中添加sqflite_common_ffi作为开发依赖:

dev_dependencies:
  sqflite_common_ffi:

环境准备

  • Linux:需要安装libsqlite3libsqlite3-dev包。对于Ubuntu系统,可以运行以下命令:

    sudo apt-get -y install libsqlite3-0 libsqlite3-dev
    
  • MacOS:通常情况下不需要额外配置。

  • Windows:在调试模式下可以直接使用,但在发布模式时需要将sqlite3.dll放置于可执行文件同一目录下。

二、示例代码

单元测试中的使用

下面是一个简单的单元测试示例,展示了如何使用sqflite_common_ffi进行基本的数据库操作:

import 'package:test/test.dart';
import 'package:sqflite_common/sqlite_api.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';

void main() {
  // 初始化FFI加载器(如果需要的话)
  sqfliteFfiInit();
  
  test('simple sqflite example', () async {
    var db = await databaseFactoryFfi.openDatabase(inMemoryDatabasePath);
    expect(await db.getVersion(), 0);
    await db.close();
  });
}

更多关于单元测试的信息,请参考官方文档

应用程序中的使用

接下来,我们来看一个完整的应用程序示例,包括创建表、插入数据以及查询数据:

import 'dart:io' as io;
import 'package:path/path.dart' as p;
import 'package:sqflite_common/sqlite_api.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:path_provider/path_provider.dart';

Future<void> main() async {
  // 初始化FFI加载器(如果需要的话)
  sqfliteFfiInit();

  var databaseFactory = databaseFactoryFfi;
  final io.Directory appDocumentsDir = await getApplicationDocumentsDirectory();
  
  // 创建数据库路径
  String dbPath = p.join(appDocumentsDir.path, "databases", "myDb.db");
  var db = await databaseFactory.openDatabase(dbPath);

  // 创建表格
  await db.execute('''
  CREATE TABLE Product (
      id INTEGER PRIMARY KEY,
      title TEXT
  )
  ''');

  // 插入数据
  await db.insert('Product', <String, Object?>{'title': 'Product 1'});
  await db.insert('Product', <String, Object?>{'title': 'Product 2'});

  // 查询数据
  var result = await db.query('Product');
  print(result); // 输出:[{id: 1, title: Product 1}, {id: 2, title: Product 2}]

  // 关闭数据库连接
  await db.close();
}

此示例还展示了如何结合path_provider插件来确定应用文档目录的位置,并在此基础上构建数据库文件的完整路径。

三、注意事项

  1. 数据库调用是在单独的隔离区(isolate)中完成的;
  2. 多实例支持是模拟实现的;
  3. getDatabasesPath()方法有一个简化的实现方式,建议根据实际情况使用如path_provider这样的包来自定义策略。

希望这些信息能够帮助你更好地理解和使用sqflite_common_ffi插件!如果你有任何问题或遇到困难,欢迎随时提问。


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

1 回复

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


在Flutter中,sqflite_common_ffi 是一个用于数据库操作的插件,它依赖于 sqflite 插件,并且提供了一个基于 FFI(Foreign Function Interface)的实现,允许在桌面和移动平台上使用 SQLite 数据库。下面是一个简单的代码案例,展示了如何使用 sqflite_common_ffi 在 Flutter 中进行数据库操作。

首先,确保在 pubspec.yaml 文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4  # 确保版本是最新的,或者根据实际需要选择
  sqflite_common_ffi: ^2.0.0+4  # 确保版本与 sqflite 兼容

然后,运行 flutter pub get 来获取依赖项。

接下来,是一个完整的 Flutter 应用示例,展示了如何使用 sqflite_common_ffi 进行数据库操作:

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';

void main() {
  // 设置数据库工厂使用 FFI 实现
  databaseFactory = databaseFactoryFfi;

  runApp(MyApp());
}

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

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

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

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

  Future<void> _initializeDatabase() async {
    // 打开(或创建)数据库
    _db = await openDatabase(
      inMemoryDatabasePath, // 使用内存数据库,也可以使用文件路径
      version: 1,
      onCreate: (Database db, int version) async {
        // 创建表
        await db.execute(
          'CREATE TABLE DemoTable ('
          'id INTEGER PRIMARY KEY,'
          'name TEXT NOT NULL,'
          'value INTEGER NOT NULL'
          ')',
        );
      },
    );
  }

  Future<void> _insertData() async {
    // 插入数据
    await _db?.insert(
      'DemoTable',
      {'name': 'Alice', 'value': 42},
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
  }

  Future<List<Map<String, dynamic>>> _queryData() async {
    // 查询数据
    return await _db?.query('DemoTable');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter SQLite Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _insertData,
              child: Text('Insert Data'),
            ),
            ElevatedButton(
              onPressed: async () async {
                List<Map<String, dynamic>> rows = await _queryData();
                // 简单的 UI 更新,展示查询结果
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                    content: Text('Query Result: ${rows.map((row) => row['name']).join(', ')}'),
                  ),
                );
              },
              child: Text('Query Data'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 设置数据库工厂:在 main 函数中,我们设置了数据库工厂使用 FFI 实现 (databaseFactory = databaseFactoryFfi;)。

  2. 数据库初始化:在 _MyHomePageStateinitState 方法中,我们打开(或创建)了一个数据库,并在 onCreate 回调中创建了一个表。

  3. 插入数据_insertData 方法展示了如何向表中插入数据。

  4. 查询数据_queryData 方法展示了如何从表中查询数据。

  5. UI 操作:在 UI 中,我们有两个按钮,一个用于插入数据,另一个用于查询数据并显示结果。

这个示例展示了基本的数据库操作,包括打开/创建数据库、创建表、插入数据和查询数据。根据具体需求,你可以进一步扩展这些功能。

回到顶部