Flutter本地数据库管理插件sqlite3的使用

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

Flutter本地数据库管理插件sqlite3的使用

sqlite3简介

sqlite3 是一个提供Dart绑定到SQLite的库,通过 dart:ffi 实现。SQLite是一个轻量级的关系型数据库管理系统,适用于移动应用、嵌入式系统和其他需要本地数据存储的应用场景。

使用此库

  1. 确保环境中有可用的共享库:根据支持的平台部分,确保您的环境中可以获取到SQLite的动态链接库。
  2. 导入包
    import 'package:sqlite3/sqlite3.dart';
    
  3. 打开数据库:可以通过 sqlite3.open() 打开一个文件数据库,或者通过 sqlite3.openInMemory() 打开一个内存中的临时数据库。
  4. 执行SQL语句:使用 Database.executeDatabase.prepare 来直接执行或准备SQL语句。
  5. 清理资源:不再需要时记得关闭预处理语句或数据库连接,以避免资源泄露。

示例代码

以下是一个完整的示例程序,展示了如何在Flutter中使用sqlite3创建表、插入数据和查询数据:

import 'dart:io';

import 'package:sqlite3/sqlite3.dart';

void main() {
  print('Using sqlite3 ${sqlite3.version}');

  // 创建一个新的内存数据库。如果要使用文件支持的数据库,可以用 sqlite3.open(yourFilePath) 替换
  final db = sqlite3.openInMemory();

  // 创建一个表格并插入一些数据
  db.execute('''
    CREATE TABLE artists (
      id INTEGER NOT NULL PRIMARY KEY,
      name TEXT NOT NULL
    );
  ''');

  // 准备一条语句以便多次执行
  final stmt = db.prepare('INSERT INTO artists (name) VALUES (?)');
  stmt
    ..execute(['The Beatles'])
    ..execute(['Led Zeppelin'])
    ..execute(['The Who'])
    ..execute(['Nirvana']);

  // 处理完后释放语句资源
  stmt.dispose();

  // 可以通过PreparedStatement.select 或者直接在数据库上调用 select 方法来运行查询语句
  final ResultSet resultSet =
      db.select('SELECT * FROM artists WHERE name LIKE ?', ['The %']);

  // 遍历结果集以逐行获取Row对象
  for (final Row row in resultSet) {
    print('Artist[id: ${row['id']}, name: ${row['name']}]');
  }

  // 注册一个可以在SQL中调用的自定义函数
  db.createFunction(
    functionName: 'dart_version',
    argumentCount: const AllowedArgumentCount(0),
    function: (args) => Platform.version,
  );
  print(db.select('SELECT dart_version()'));

  // 记得释放数据库资源以防止内存泄漏
  db.dispose();
}

支持的平台

sqlite3 支持多种平台,包括但不限于:

  • Android: 可以依赖 sqlite3_flutter_libs 包来打包最新的 SQLite 版本。
  • iOS: 内置了SQLite版本,默认情况下会使用它;也可以依赖 sqlite3_flutter_libs
  • Linux: 可以依赖 sqlite3_flutter_libs,或者从发行版的包管理器安装SQLite(如Debian上的libsqlite3-dev)。
  • macOS: 同样内置了SQLite,并且可以选择依赖 sqlite3_flutter_libs
  • Windows: 可以依赖 sqlite3_flutter_libs,不使用Flutter时则需手动包含SQLite。
  • Web: 支持通过WebAssembly编译后的SQLite版本进行访问,但仅限于dartdevcdart2js编译器。

数据类型支持

当绑定参数到查询时,支持的数据类型有intdoubleStringList<int>(用于BLOB)和null。在网页端还额外支持BigInt

WebAssembly(Web支持)

对于Web的支持是实验性的,需要特定方式编译的SQLite WebAssembly模块以及文件系统实现。更多细节请参阅官方文档。

其他特性

  • 手动提供SQLite库:允许用户自行打包SQLite库。
  • 加密支持:支持加载带有加密功能的SQLite Multiple Ciphers版本。
  • 跨平台代码共享:提供了公共接口供不同平台间的代码复用。
  • 测试与构建:详细的测试指导和从源码编译指南。

以上就是关于sqlite3插件的基本介绍及使用方法,希望对您有所帮助!如果您有任何疑问或需要更深入的帮助,请随时提问。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用sqlite3插件进行本地数据库管理的示例代码。需要注意的是,Flutter社区中更常用的SQLite插件是sqflite,但既然你特别提到了sqlite3,我会基于这个插件(假设它存在并且功能类似)给出一个示例。不过,请注意,如果sqlite3插件在Flutter社区中不常见或文档不充足,你可能需要查阅其官方文档或仓库以获取更详细的信息。

首先,确保你已经在pubspec.yaml文件中添加了sqlite3插件的依赖(注意:这里假设sqlite3是一个有效的Flutter插件,实际上你可能需要查找并确认正确的插件名称和版本):

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

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

接下来,是一个简单的Flutter应用示例,展示了如何使用sqlite3插件进行数据库操作:

import 'package:flutter/material.dart';
import 'package:sqlite3/sqlite3.dart';  // 假设插件名为sqlite3

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter SQLite3 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();
    initDatabase();
  }

  Future<void> initDatabase() 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.transaction((txn) async {
      await txn.execute(
        'INSERT INTO DemoTable(name, value) VALUES(?, ?)',
        ['Alice', 42]
      );
    });
  }

  Future<List<Map<String, dynamic>>> queryData() async {
    return await db.query('DemoTable', columns: ['id', 'name', 'value']);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter SQLite3 Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                await insertData();
                setState(() {}); // 触发UI更新(如果需要)
              },
              child: Text('Insert Data'),
            ),
            ElevatedButton(
              onPressed: () async {
                List<Map<String, dynamic>> results = await queryData();
                // 这里可以处理查询结果,比如显示在屏幕上
                print(results);
              },
              child: Text('Query Data'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    db.close(); // 关闭数据库连接
    super.dispose();
  }
}

在这个示例中,我们:

  1. initState方法中初始化了数据库,并创建了一个名为DemoTable的表。
  2. 提供了一个insertData方法,用于向表中插入数据。
  3. 提供了一个queryData方法,用于从表中查询数据。
  4. 在UI中提供了两个按钮,分别用于触发插入和查询操作。

请注意,inMemoryDatabasePath是一个用于创建内存数据库的快捷方式,它在实际应用中可能不是你所需要的。你可能希望使用文件路径来持久化数据库。此外,sqlite3插件的具体API可能有所不同,因此你需要查阅其官方文档以获取准确的用法。

如果sqlite3插件实际上不存在或不可用,你可能需要查找并使用其他流行的SQLite插件,如sqflite

回到顶部