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();
}