前言
Flutter 目前比较好用的 sqlite 数据库 orm 框架就是drift (以前叫作moor),由于dart语言不支持反射,这个框架使用了dart代码生成器,自动生成代码。这个数据库框架的优点是支持全平台使用,此框架通过使用datr语言的 ffi 功能(相当于JAVA的jni)来调用 sqlite 动态库 实现数据库操作,
Web平台是通过 wasm(浏览器可以运行的二进制文件,可由C、C++、rust、go 等语言编译而来)来调用sqlite, Web平台的sqlite数据库文件则通过 indexed db 虚拟文件系统保存。下面来介绍一下使用方法。
官方文档
https://drift.simonbinder.eu/docs/platforms/
先导入依赖
dependencies:
drift: ^2.4.2
sqlite3_flutter_libs: ^0.5.0
#sqlcipher_flutter_libs: ^0.5.1
path_provider: ^2.0.0
path: ^1.8.3
dev_dependencies:
drift_dev: ^2.4.1
build_runner: ^2.3.3
这里是对每个包的作用的快速概述:
- drift: 这是定义大多数 api 的核心包
- sqlite3_flutter_libs: 提供 sqlite 动态库,如果要加密数据库,请使用 sqlcipher_flutter_libs
- sqlcipher_flutter_libs: 提供 sqlcipher (加密版sqlite) 动态库,如果要加密数据库请添加此依赖,并移除sqlite3_flutter_libs依赖(共存会冲突)
- path_provider 和 path:用于寻找合适的位置来存放数据库。 由 Flutter 和 Dart 团队维护
- drift_dev:drift自动生成代码工具、 不会包含在最终应用程序中。
- build_runner: 代码生成的通用工具,由 Dart 团队维护
下面仅示例使用加密版sqlite:
创建一个文件 databases.dart
import 'dart:io';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:logger/logger.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
//引入自动生成的代码,刚开始会报错,运行 flutter pub run build_runner build 即可
part 'database.g.dart';
//数据库密码
const _encryptionPassword = 'password';
//定义一个表
class Notes extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get content => text()();
}
//这个注解告诉 Drift 创建一个包含 我们上面定义的 Notes 表的数据库类(数据库操作类)
(tables: [Notes])
class MyEncryptedDatabase ext