sqlite_async

Dart & Flutter 上 SQLite 的高性能异步接口。

SQLite 小巧、快速,具有大量内置功能,并且非常适合作为应用内数据库。然而,SQLite 是为许多不同的用例设计的,并且需要一些配置才能作为应用内数据库获得最佳性能。

用于直接同步访问 SQLite 数据库的 sqlite3 Dart 绑定很棒,但配置由开发人员自行决定。

该库封装了绑定,并使用一组良好的默认值配置数据库,所有数据库调用都是异步的,以避免阻塞 UI,同时仍提供直接的 SQL 查询访问。

特点

  • 所有操作默认都是异步的——不会阻塞主 Isolate。
  • 在底层数据更改时自动重新运行查询。
  • 默认支持并发事务——一个写入事务和多个读取事务。
  • 使用 WAL 模式以实现快速写入,并支持在写入事务期间并发运行读取事务。
  • 支持在 Isolate 中进行直接同步访问,以满足性能敏感的用例。
  • 在适用时自动将查询参数转换为 JSON,从而简化 JSON1 操作。
  • 直接 SQL 查询——无需包装类或代码生成。

安装

dart pub add sqlite_async

对于 flutter 应用程序,另外添加 sqlite3_flutter_libs 以包含原生 SQLite 库。

对于其他平台,请参阅 sqlite3 包文档

目前不支持 Web。

入门

import 'package:sqlite_async/sqlite_async.dart';

final migrations = SqliteMigrations()
  ..add(SqliteMigration(1, (tx) async {
    await tx.execute(
        'CREATE TABLE test_data(id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT)');
  }));

void main() async {
  final db = SqliteDatabase(path: 'test.db');
  await migrations.migrate(db);

  // Use execute() or executeBatch() for INSERT/UPDATE/DELETE statements
  await db.executeBatch('INSERT INTO test_data(data) values(?)', [
    ['Test1'],
    ['Test2']
  ]);

  // Use getAll(), get() or getOptional() for SELECT statements
  var results = await db.getAll('SELECT * FROM test_data');
  print('Results: $results');

  // Combine multiple statements into a single write transaction for:
  // 1. Atomic persistence (all updates are either applied or rolled back).
  // 2. Improved throughput.
  await db.writeTransaction((tx) async {
    await db.execute('INSERT INTO test_data(data) values(?)', ['Test3']);
    await db.execute('INSERT INTO test_data(data) values(?)', ['Test4']);
  });

  await db.close();
}

GitHub

查看 Github