Flutter外部数据库访问插件sql_external_db的使用

Flutter外部数据库访问插件sql_external_db的使用

简介

sql_external_db 是一个用于在 Flutter 中访问外部数据库的插件。它允许开发者通过文件路径访问外部数据库,并执行相关的 SQL 操作。

插件信息


使用步骤

以下是一个完整的示例,展示如何在 Flutter 应用中使用 sql_external_db 插件来访问外部数据库。


示例代码

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:sql_external_db/sql_external_db.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown'; // 存储平台版本或数据库路径
  final _sqlExternalDbPlugin = const SqlExternalDb(); // 初始化插件实例

  @override
  void initState() {
    super.initState();
    initPlatformState(); // 初始化插件状态
  }

  // 异步方法,初始化插件状态
  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      // 调用插件方法获取外部数据库路径
      platformVersion = await _sqlExternalDbPlugin
          .externalPath('group.com.hodoan.db_shared//aa.db') ??
          'Unknown platform version';
    } on PlatformException {
      // 捕获异常并返回错误信息
      platformVersion = 'Failed to get platform version.';
    }

    // 如果组件已从树中移除,则不更新状态
    if (!mounted) return;

    // 更新 UI
    setState(() {
      _platformVersion = platformVersion;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('sql_external_db 示例'), // 设置应用标题
        ),
        body: Center(
          child: Text('运行在: $_platformVersion\n'), // 显示数据库路径或错误信息
        ),
      ),
    );
  }
}

代码说明

  1. 导入必要的包:

    • flutter/material.dart: 提供 Flutter 的基础组件。
    • dart:async: 支持异步操作。
    • flutter/services.dart: 提供与原生平台交互的功能。
    • sql_external_db/sql_external_db.dart: 插件的核心功能。
  2. 初始化插件:

    • 创建 _sqlExternalDbPlugin 实例,用于调用插件方法。
  3. 初始化状态:

    • initState 方法中调用 initPlatformState,异步获取外部数据库路径。
  4. 处理异步操作:

    • 使用 try-catch 块捕获可能的异常,并返回默认值或错误信息。
  5. 更新 UI:

    • 使用 setState 更新界面以显示数据库路径或错误信息。

运行效果

运行此示例后,应用会显示类似以下内容:

运行在: /path/to/your/database/aa.db

如果出现错误,会显示:

运行在: Failed to get platform version.

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

1 回复

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


sql_external_db 是一个 Flutter 插件,用于访问和管理外部 SQLite 数据库。它允许你在 Flutter 应用中直接操作位于设备文件系统中的 SQLite 数据库文件,而不需要将数据库文件打包到应用中。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 sql_external_db 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  sql_external_db: ^0.0.1  # 请检查最新版本

然后运行 flutter pub get 来安装插件。

使用插件

1. 导入插件

import 'package:sql_external_db/sql_external_db.dart';

2. 初始化数据库

你需要指定外部数据库文件的路径。通常,你可以将数据库文件放在设备的某个目录中,例如应用的文档目录。

Future<void> initDatabase() async {
  // 获取应用的文档目录
  final directory = await getApplicationDocumentsDirectory();
  final dbPath = '${directory.path}/my_database.db';

  // 初始化数据库
  final db = await SqlExternalDb.openDatabase(dbPath);

  // 创建表(如果需要)
  await db.execute('''
    CREATE TABLE IF NOT EXISTS my_table (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT NOT NULL,
      age INTEGER
    )
  ''');
}

3. 插入数据

Future<void> insertData() async {
  final db = await SqlExternalDb.openDatabase(dbPath);
  await db.insert('my_table', {'name': 'John Doe', 'age': 30});
}

4. 查询数据

Future<List<Map<String, dynamic>>> queryData() async {
  final db = await SqlExternalDb.openDatabase(dbPath);
  return await db.query('my_table');
}

5. 更新数据

Future<void> updateData() async {
  final db = await SqlExternalDb.openDatabase(dbPath);
  await db.update('my_table', {'age': 31}, where: 'name = ?', whereArgs: ['John Doe']);
}

6. 删除数据

Future<void> deleteData() async {
  final db = await SqlExternalDb.openDatabase(dbPath);
  await db.delete('my_table', where: 'name = ?', whereArgs: ['John Doe']);
}

7. 关闭数据库

Future<void> closeDatabase() async {
  final db = await SqlExternalDb.openDatabase(dbPath);
  await db.close();
}

注意事项

  1. 权限问题:在 Android 上,访问外部存储可能需要特定的权限。确保你在 AndroidManifest.xml 中添加了必要的权限。

  2. 数据库路径:确保你提供的数据库路径是正确的,并且应用有权限访问该路径。

  3. 数据库版本管理:如果你需要升级数据库结构,可能需要实现数据库版本管理逻辑。

  4. 错误处理:在实际应用中,建议对数据库操作进行错误处理,以应对可能出现的异常情况。

示例代码

以下是一个完整的示例,展示了如何使用 sql_external_db 插件进行数据库操作:

import 'package:flutter/material.dart';
import 'package:sql_external_db/sql_external_db.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initDatabase();
  runApp(MyApp());
}

Future<void> initDatabase() async {
  final directory = await getApplicationDocumentsDirectory();
  final dbPath = '${directory.path}/my_database.db';
  final db = await SqlExternalDb.openDatabase(dbPath);
  await db.execute('''
    CREATE TABLE IF NOT EXISTS my_table (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT NOT NULL,
      age INTEGER
    )
  ''');
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('SQL External DB Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: insertData,
                child: Text('Insert Data'),
              ),
              ElevatedButton(
                onPressed: () async {
                  final data = await queryData();
                  print(data);
                },
                child: Text('Query Data'),
              ),
              ElevatedButton(
                onPressed: updateData,
                child: Text('Update Data'),
              ),
              ElevatedButton(
                onPressed: deleteData,
                child: Text('Delete Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Future<void> insertData() async {
  final directory = await getApplicationDocumentsDirectory();
  final dbPath = '${directory.path}/my_database.db';
  final db = await SqlExternalDb.openDatabase(dbPath);
  await db.insert('my_table', {'name': 'John Doe', 'age': 30});
}

Future<List<Map<String, dynamic>>> queryData() async {
  final directory = await getApplicationDocumentsDirectory();
  final dbPath = '${directory.path}/my_database.db';
  final db = await SqlExternalDb.openDatabase(dbPath);
  return await db.query('my_table');
}

Future<void> updateData() async {
  final directory = await getApplicationDocumentsDirectory();
  final dbPath = '${directory.path}/my_database.db';
  final db = await SqlExternalDb.openDatabase(dbPath);
  await db.update('my_table', {'age': 31}, where: 'name = ?', whereArgs: ['John Doe']);
}

Future<void> deleteData() async {
  final directory = await getApplicationDocumentsDirectory();
  final dbPath = '${directory.path}/my_database.db';
  final db = await SqlExternalDb.openDatabase(dbPath);
  await db.delete('my_table', where: 'name = ?', whereArgs: ['John Doe']);
}
回到顶部