Flutter项目WanWan之数据库moor

Posted 白玉梁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter项目WanWan之数据库moor相关的知识,希望对你有一定的参考价值。

项目地址 GitHub:https://github.com/baiyuliang/Flutter-WanWan

moor文档地址:https://moor.simonbinder.eu/docs/getting-started/

我们在开发安卓或ios的数据库时,都会有各种强大的第三方rom框架,如安卓端的greenDao,room等,
这可以避免我们原生实现和手写sql的痛苦,那么同样,我们在开发flutter时,有没有同样强大的rom框架呢?答案是,必须的!就是上面提到的moor!

目前来说,该框架用的人还不是很多,所有你会发现,在百度moor的使用方法时,除了官方的英文文档,国内很少相关使用文章!

我们先来看一下官方的使用方法:



我最初在按照文档使用时,也是一头雾水,一是不清楚给的其它库最新版本号,二是在编译时遇到各种错误(其实是自己开发环境问题以及库的版本问题)!好在后来发现一个专门用于flutter的moor工具库:moor_flutter

moor_flutter就是对moor的又一层封装,使moor在flutter中使用更加简单方便!

首先,引入moor_flutter:

dependencies:
  flutter:
    sdk: flutter
  moor_flutter: ^4.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  moor_generator: ^4.4.1
  build_runner: ^2.1.1

moor_flutter最新版本4.0.0,moor_generator最新版本(也就是moor的最新版本)4.4.1!

执行pub get!

创建数据库文件夹,以及文件:

创建数据库表:我们可以像greenDao或Room一样,去写一个对应数据库表的类,当然要注意moor的写法:

@DataClassName("User")
class UserTable extends Table {
  IntColumn get id => integer().autoIncrement()();

  TextColumn get userid => text()();

  TextColumn get pwd => text()();

  TextColumn get nickname => text()();

  TextColumn get avatar => text()();

  TextColumn get imToken => text()();
}

@DataClassName(“User”):创建一个表名为User的表,UserTable继承Table类;

IntColumn 表示字段类型为int;

TextColumn 表示字段类型为String;

我们还可以设置自增字段以及主键等等;

表创建完毕后,定义数据库操作类:AppDatabase(名称自定义):

@UseMoor(tables: [UserTable])
class AppDatabase extends _$AppDatabase {
  AppDatabase._()
      : super(FlutterQueryExecutor.inDatabaseFolder(
            path: "db.sqlite", logStatements: true));

  static AppDatabase _instance;

  static AppDatabase getInstance() {
    if (_instance == null) {
      _instance = AppDatabase._();
    }
    return _instance;
  }

  int get schemaVersion => 1;

  Future<List<User>> getAllUsers() => select(userTable).get();

  Stream<List<User>> watchAllUsers() => select(userTable).watch();

  Future insertUser(User user) => into(userTable).insert(user);

  Future updateUser(User user) => update(userTable).replace(user);

  Future deleteUser(User user) => delete(userTable).delete(user);

这个其实我们一看就明白了,

@UseMoor(tables: [UserTable]),创建了几个表,就在这里添加几个[UserTable,XXXTable,…];

get schemaVersion => 1,数据库版本号为1;

select,into,update,delete即框架提供的增删改查方法,非常简单;

单例模式,可以保证数据库操作类不会重复创建数据库对象从而导致各种问题的出现!

最后需要注意的是,AppDatabase 所继承的_$AppDatabase,我们在执行编译前它是不存在的,所以报错不要怕!

我们先在类顶部声明一个part路径:

part 'db.g.dart';

然后,在命令行中执行:

flutter packages pub run build_runner build

flutter packages pub run build_runner watch

build和watch的区别

build:只编译生成一次,如果数据库字段有改动,则需要重新执行编译!

watch:持续编译,只要有改动就会自动编译!

执行后,生成 db.g.dart:



接下来,我们可以安装app了,打开安卓端数据库分析工具:


完美!

以上是关于Flutter项目WanWan之数据库moor的主要内容,如果未能解决你的问题,请参考以下文章

Flutter项目WanWan之接入融云IM和自定义Plugin

Flutter项目WanWan之接入融云IM和自定义Plugin

无法分别构建 Flutter Web 和 Flutter Mobile 应用

使用flutter_moor时如何停止多次创建类数据库文件?

在 Flutter 中使用 moor 时使用关键字时出错

Flutter StreamProvider 没有将数据推送到 UI