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

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

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

简介

sqlite3_flutter_libs 插件本身不包含任何 Dart 代码。它为 Android、iOS、macOS、Linux 和 Windows 提供了原生的 sqlite3 库。有关如何在 Flutter 应用中实际使用此包,请参阅 sqlite3

该包编译的 sqlite3 版本使用了推荐的编译选项,并默认包含 fts5 模块(json1 模块是最近版本 sqlite3 的默认构建的一部分)。其他模块未包含在此构建中。

Android 注意事项

包含的平台

在 Android 上,此库将为以下所有平台捆绑 sqlite3:

  • arm64-v8a
  • armeabi-v7a
  • x86
  • x86_64

如果您不打算发布到 32 位 x86 设备,则需要在 build.gradle 中应用过滤器:

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
        }
    }
}

Android 6 的问题

在 Android 6 上加载原生库时可能会出现问题。如果您遇到这些崩溃,可以尝试在 gradle.properties 文件中设置 android.bundle.enableUncompressedNativeLibs=false。请注意,这会增加应用程序安装后的大小。

或者,您可以使用 applyWorkaroundToOpenSqlite3OnOldAndroidVersions 方法。该方法会在 Java 中尝试打开 sqlite3,这似乎更可靠。加载 sqlite3 后,我们也可以在 Dart 中打开它。此方法应在使用 sqlite3 之前调用(无论是直接还是通过 package:drift 中的 NativeDatabase 间接调用)。

由于 applyWorkaroundToOpenSqlite3OnOldAndroidVersions 使用平台通道,在后台隔离区中使用它可能会有问题。我们建议在主隔离区中等待它,启动可能使用数据库的后台隔离区之前

提供临时路径

如果复杂的查询失败并显示 SQLITE_IOERR_GETTEMPPATH 6410 错误,您可以尝试显式设置 sqlite3 使用的临时路径。此评论包含一个实现此功能的代码片段。

示例代码

以下是一个完整的示例,演示如何在 Flutter 应用中使用 sqlite3_flutter_libssqlite3 包进行数据库操作:

pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  sqlite3_flutter_libs: ^0.5.0
  sqlite3: ^2.0.0

main.dart

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // Apply workaround for old Android versions if necessary
  await applyWorkaroundToOpenSqlite3OnOldAndroidVersions();

  runApp(MyApp());
}

Future<void> applyWorkaroundToOpenSqlite3OnOldAndroidVersions() async {
  // Implement the workaround as needed for old Android versions
}

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late Database db;
  List<Map<String, Object?>>? items;

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

  void openDatabase() {
    // Open a connection to the database (note: path should be adjusted as needed)
    db = sqlite3.open('example.db');

    // Create a table
    db.execute('''
      CREATE TABLE IF NOT EXISTS items (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL
      )
    ''');

    // Insert some data
    db.execute("INSERT INTO items (name) VALUES ('Item 1')");
    db.execute("INSERT INTO items (name) VALUES ('Item 2')");

    // Query the database
    items = db.select('SELECT * FROM items');
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView.builder(
        itemCount: items?.length ?? 0,
        itemBuilder: (context, index) {
          final item = items![index];
          return ListTile(
            title: Text(item['name'] as String),
          );
        },
      ),
    );
  }

  @override
  void dispose() {
    db.close();
    super.dispose();
  }
}

这个示例展示了如何创建一个简单的 SQLite 数据库,插入一些数据,并在 Flutter 应用中显示这些数据。请根据您的具体需求调整数据库路径和其他配置。


以上内容详细介绍了 `sqlite3_flutter_libs` 插件的使用方法,并提供了一个完整的示例代码来帮助您更好地理解其用法。希望这对您有所帮助!

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用sqlite3_flutter_libs插件进行数据库管理的代码示例。这个插件允许你在Flutter应用中直接操作SQLite数据库。

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

dependencies:
  flutter:
    sdk: flutter
  sqlite3_flutter_libs: ^x.y.z  # 请替换为最新版本号

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

接下来,是一个简单的示例,展示如何打开数据库、创建表、插入数据、查询数据以及关闭数据库。

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SQLite3 Flutter Demo'),
        ),
        body: DatabaseDemo(),
      ),
    );
  }
}

class DatabaseDemo extends StatefulWidget {
  @override
  _DatabaseDemoState createState() => _DatabaseDemoState();
}

class _DatabaseDemoState extends State<DatabaseDemo> {
  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 users (
          id INTEGER PRIMARY KEY,
          name TEXT NOT NULL,
          age INTEGER NOT NULL
        )
        '''
      );
    });
  }

  Future<void> insertData() async {
    // 插入数据
    await db.insert(
      'users',
      {
        'name': 'Alice',
        'age': 30,
      },
      conflictAlgorithm: ConflictAlgorithm.replace
    );

    await db.insert(
      'users',
      {
        'name': 'Bob',
        'age': 25,
      },
      conflictAlgorithm: ConflictAlgorithm.replace
    );
  }

  Future<List<Map<String, dynamic>>> queryData() async {
    // 查询数据
    return await db.query('users');
  }

  Future<void> closeDatabase() async {
    // 关闭数据库
    await db.close();
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: () async {
              await insertData();
              final data = await queryData();
              print(data); // 在控制台打印查询结果
            },
            child: Text('Insert and Query Data'),
          ),
          ElevatedButton(
            onPressed: closeDatabase,
            child: Text('Close Database'),
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    // 确保在组件销毁时关闭数据库
    closeDatabase().then((_) => super.dispose());
  }
}

代码说明:

  1. 依赖添加:在pubspec.yaml中添加sqlite3_flutter_libs依赖。
  2. 数据库初始化:在initDatabase方法中,使用openDatabase方法打开或创建一个数据库,并在onCreate回调中创建一个表。
  3. 数据插入insertData方法向users表中插入数据。
  4. 数据查询queryData方法从users表中查询数据并返回。
  5. 数据库关闭closeDatabase方法关闭数据库连接。
  6. UI交互:在UI中提供了按钮来触发数据插入、查询和数据库关闭操作。

请注意,inMemoryDatabasePath用于创建一个内存数据库,这在开发阶段很有用,但在生产环境中你可能希望使用持久化存储路径。

希望这个示例能帮助你理解如何在Flutter项目中使用sqlite3_flutter_libs插件进行数据库管理。

回到顶部