前言

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.2sqlite3_flutter_libs: ^0.5.0#sqlcipher_flutter_libs: ^0.5.1path_provider: ^2.0.0path: ^1.8.3dev_dependencies:drift_dev: ^2.4.1build_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 表的数据库类(数据库操作类)
@DriftDatabase(tables: [Notes])
class MyEncryptedDatabase extends _$MyEncryptedDatabase {MyEncryptedDatabase() : super(_openDatabase());//设置数据库版本。@overrideint get schemaVersion => 1;//数据库迁移方法@overrideMigrationStrategy get migration {return MigrationStrategy(beforeOpen: (details) async {},);}
}//自定义打开数据库的方法
QueryExecutor _openDatabase() {return LazyDatabase(() async {//通过路径提供器获取目录以存放数据库文件final path = (Platform.isMacOS || Platform.isIOS)? await getApplicationDocumentsDirectory(): await getApplicationSupportDirectory();//这是数据库文件。final dbFile = p.join(path.path, 'databases', 'app.db');Logger().d(dbFile);return NativeDatabase(File(dbFile),setup: (db) {//这个语法检查数据库是否已经加密final result = db.select('pragma cipher_version');if (result.isEmpty) {throw UnsupportedError('this database needs to run with sqlcipher, but that library is ''not available!',);}else{Logger().d("数据库已加密");}//数据库的密码。final escapedKey = _encryptionPassword;//通过密码打开数据库。db.execute("pragma key = '$escapedKey'");},);});
}

加密版本的数据库需要覆盖打开数据库的方法,创建一个 setup.dart

import 'package:sqlcipher_flutter_libs/sqlcipher_flutter_libs.dart';
import 'dart:ffi';
import 'package:sqlite3/open.dart';setupDatabases() {open..overrideFor(OperatingSystem.android, openCipherOnAndroid)..overrideFor(OperatingSystem.iOS, DynamicLibrary.process);// 其他平台不需要覆盖
}

测试

运行生成代码命令

flutter pub run build_runner build

然后即可运行

Future<void> main() async {//确保组件树初始化WidgetsFlutterBinding.ensureInitialized();//覆盖数据库打开方法setupDatabases();//创建数据库final _database = MyEncryptedDatabase();//操作数据库_database.into(_database.notes).insert(NotesCompanion.insert(content: "test"));//查询var r = await _database.select(_database.notes).get();Logger().d(r);runApp(const MyApp());// runApp(const AutocompleteExampleApp());
}

Web 平台

这是native平台使用方法,
建议web平台另外创建一个分支,否则依赖会报错
web平台使用方法如下:
web平台的_openDatabase方法不同

import 'package:dio/dio.dart';
import 'package:drift/drift.dart';
import 'package:drift/wasm.dart';
import 'package:sqlite3/wasm.dart';
part 'database.g.dart';// ...more codeQueryExecutor _openDatabase() {return LazyDatabase(() async {// 加载 sqlite3.wasmfinal response = await Dio().getUri(Uri.parse('sqlite3.wasm'),options: Options(responseType:ResponseType.bytes));// 创建一个由 IndexedDb 支持的虚拟文件系统final fs = await IndexedDbFileSystem.open(dbName: 'my_app');final sqlite3 = await WasmSqlite3.load(response.data,SqliteEnvironment(fileSystem: fs),);// 然后,在该文件夹中打开一个数据库。return WasmDatabase(sqlite3: sqlite3, path: 'app.db');});
}

测试, web平台不需要调用 setupDatabases()

  1. 运行生成代码命令
flutter pub run build_runner build
  1. 把 sqlite3.wasm 放到web目录下, 必须使用定制的 sqlite3.wasm , 下载地址https://github.com/simolus3/sqlite3.dart/releases/tag/sqlite3-1.9.1

然后即可运行

Future<void> main() async {//确保组件树初始化WidgetsFlutterBinding.ensureInitialized();//创建数据库final _database = MyEncryptedDatabase();//操作数据库_database.into(_database.notes).insert(NotesCompanion.insert(content: "test"));//查询var r = await _database.select(_database.notes).get();Logger().d(r);runApp(const MyApp());// runApp(const AutocompleteExampleApp());
}

Flutter 全平台 sqlite/sqlcipher orm 框架 drift(原moor)的使用相关推荐

  1. 27.Python数据库操作(一)【内置数据库SQLite和ORM框架SQLAlchemy】

    目录: 每篇前言: Python数据库操作(一) 1.1 SQLite 1.2 ORM框架SQLAlchemy 每篇前言:

  2. [译]Flutter持久化库drift(原moor)查看组件moor_db_viewer

    本文件翻译自 moor_db_viewer | Flutter Package (pub.dev) 肉翻多有不足~ 不吝赐教 看示例很 NB,文档稍显单薄. moor_db_viewer 该包允许我们 ...

  3. Flutter 制霸全平台?这事儿我看有戏。

    "小步快跑.快速迭代"的开发大环境下,"一套代码.多端运行"可以说是很多技术团队的梦想.为了这个梦想,我曾考察过很多跨平台开发框架,比如 React Nativ ...

  4. 最受欢迎的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  5. android的orm框架有哪些,Android 常用的ORM框架详解

    1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation ...

  6. Google发布Flutter 2.0正式版,支持全平台程序构建

    今天,Google发布了 Flutter 2.0的正式版本,至2018年Flutter 1.0版本发布以来,在最近的3年的时间礼,Flutter进行了大量的升级以支持更多平台的开发需求.作为 Flut ...

  7. 【译】Flutter 2.0 正式版发布,全平台 Stable

    针对 Web,Mobile 和 Desktop 的下一代 Flutter . 今天 Flutter 2 正式版发布了,作为 Flutter 的重大升级,使用 Flutter 2 开发者可以用相同的代码 ...

  8. 几种常见的ORM框架

    [1]Mybatis 官网地址:https://github.com/mybatis/mybatis-3 ① 概要 MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBa ...

  9. ORM框架你了解多少?

    1.什么是ORM? 对象-关系映射(Object-Relational Mapping,简称ORM),所谓的 ORM 框架就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述 Ja ...

最新文章

  1. opencv中的createsamples.exe生成vec文件注意事项
  2. C#刷遍Leetcode面试题系列连载(2): No.38 - 报数
  3. typescript和 java区别_typescript中interface和type的区别
  4. java发送http post请求报文_Java 用HTTP的方式发送JSON报文请求
  5. vue中 v-show和v-if的区别?
  6. 解决Docker安装MySQL不区分大小写问题
  7. 庞果网一道题(字符博弈)的一点想法
  8. 高通处理器命名中文化
  9. 辉迅手机号码归属地查询软件 手机号码归属地 手机查询
  10. win10启动修复_高手教你怎样在Win10上修复主引导记录(MBR),轻松解决启动故障...
  11. ucfirst() strtoupper() strtolower()
  12. 2020 最新版《神经网络和深度学习》中文版.pdf
  13. 这种高逼格的图片效果,居然也可以用PPT制作!
  14. 中文数字与阿拉伯数字转换(Python)
  15. python web py入门(2)-URL处理
  16. 小白如何通过markdown文件自制kindle的 MOBI 格式文档
  17. 蓝牙耳机的LDAC、aptX指的都是什么?
  18. docker部署html页面,在Docker容器中部署静态网页的方法教程
  19. 基于SSM的图书馆座位预约管理系统
  20. eSpace VTM Solution在金融信贷领域的应用开发

热门文章

  1. 苹果 AirPods 耳机总是连到别人的iPhone,如何解决?
  2. 别了,Windows!别了,微软!
  3. scons 工具使用
  4. 项目六 PLC与RobotStudio联合仿真激光切割工作站——系统联调
  5. R7000P双系统装机记录
  6. dapper mysql 迁移_使用Dapper操作Mysql数据库
  7. 数据结构一 线性结构和非线性结构
  8. 软件外包基础--§2 什么是BSE
  9. 支付宝支付功能(一)
  10. python随机森林变量重要性_python中随机森林如何优化