flutter中数据库(Drift)的使用

前言

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.2

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 团队维护。

使用方式一:通过drift文件,编写数据库sql语句创建表和字段

创建一个名为student的drift文件 “student.drift”,并在文件中写入以下代码:创建一个学生表

CREATE TABLE student (
    id INT NOT NULL PRIMARY KEY AUTOINCREMENT,
    name TEXT
);

在这里插入图片描述

创建文件db_manager.dart

import 'package:drift/drift.dart';
import 'dart:io';
import 'package:drift/native.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
part 'db_manager.g.dart';//这里会报错,不过没关系,执行 flutter pub run build_runner build
(
  include: {
   
   'student.drift'},//引入表文件,多张表只需在这里添加即可
)
class DBManager extends _$DBManager {
   
   
  DBManager() : super(_openConnection());
  
  int get schemaVersion => 1;
}
LazyDatabase _openConnection() {
   
   
  return LazyDatabase(() async {
   
   
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'test.db'));//数据库名字
    return NativeDatabase(file);
  });
}

编写增删改查方法

  Future<List<StudentData>> getStudent() async {
   
   
    return await select(student).get();
  }

  Future<int> saveStudent(StudentCompanion companion) async {
   
   
    return await into(student).insert(companion);
  }

  Future<int> deleteEmployee(int id) async {
   
   
    return (delete(student)
      ..where(student.id.equals(id) as Expression<bool> Function(Student tbl)))
        .go();
  }

  Future<int> deleteAllEmployee() async {
   
   
    return await delete(student).go();
  }

  Future<int> updateEmployee(StudentCompanion companion) async {
   
   
    return await update(student).write(StudentCompanion(
        name: Value(companion.name as String?)
    ));
  }

运行下面代码,点击一下添加一条数据

import 'package:flutter/material.dart';
import 'package:flutter_lib/db/db_manager.dart';
import 'package:drift/drift.dart' as d;
DBManager? dbManager;
void main(){
   
   
  dbManager=DBManager();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
   
   
  const MyApp({
   
   super.key});

  // This widget is the root of your application.
  
  Widget build(BuildContext context) {
   
   
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        body: Center(
          child: IconButton(
            icon: const Icon(Icons.thumb_up),
            onPressed: () => {
   
   
              dbManager!.saveStudent(
                const StudentCompanion(
                  name: d.Value("添加一条数据"),
                ),
              )
            },
          ),
        ),
      ),
    );
  }
}

可以看到生成了一个名为test的数据库

在这里插入图片描述
导出数据库文件,可以看到有张表student
在这里插入图片描述
使用方式二:通过继承Table类,生成表和字段

创建employee.dart文件,写入以下代码

class Employee extends Table{
   
   
  IntColumn get id => integer().autoIncrement()();
  TextColumn get title => text().withLength(min: 6, max: 32)();
  TextColumn get content => text().named('body')();
  IntColumn get category => integer().nullable()();
}

创建db_manager.dart文件,写入以下代码

import 'package:drift/drift.dart';
import 'dart:io';
import 'package:drift/native.dart';
import 'package:flutter_lib/db/employee.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;

part 'db_manager.g.dart';//这里会报错,不过没关系,执行 flutter pub run build_runner build

(tables: [Employee])
class AppDatabase extends _$AppDatabase{
   
   
  AppDatabase() : super(_openConnection
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值