Flutter数据库管理插件m7db的使用

Flutter数据库管理插件m7db的使用

m7db 是一个简单的Dart包,旨在简化在Flutter项目中使用sqflite的方式。它的主要目的是:

  1. 提供一个抽象的数据访问对象(DAO)类,该类提供了CRUD操作及一些常见的事务。
  2. 移除每个项目中重复的代码。
  3. 提供处理sqflite常见情况的帮助方法。

最终你将获得什么

// 示例代码

void main() async {
  Database database = AppDB();
  String tableName = 'User';
  // 创建Dao
  UserDao userDao = UserDao(database, tableName);
  // 这是数据类,即表
  User user = User();

  // 基本的CRUD操作
  // 根据ID获取
  userDao.getById('id');
  
  // 返回整个表
  userDao.getAll();
  
  // 插入新的记录
  userDao.insert(user);
  
  // 更新旧的记录
  userDao.update(user);
  
  // 删除传递的用户
  userDao.delete(user);
  
  // 插入一个User列表
  userDao.insertAll([user]);
  
  /// [watchAll] 返回一个流,持续监控整个表
  /// 当调用继承的CRUD操作时(上面的操作),它会自动更新流以反映最新的值
  userDao.watchAll().listen((event) { });
}

如何正确使用它

m7db 包含三个主要类:M7DBM7TableM7Dao。你需要扩展这三个类,以便它们能协同工作。这三类试图移除冗余代码,并提供帮助函数。

1. M7DB 类

M7DB 将为你创建数据库。它还提供了一些辅助方法,例如 createTableStatement()

示例

要使用它,你应该扩展 M7DB

M7DB 强制你覆盖以下内容:

  1. databaseName 获取器
  2. onCreate 函数将在数据库初始化时被调用(非常适合创建你的表)
  3. version,代表数据库版本(用于迁移)
class AppDB extends M7DB {
  // 覆盖 databaseName
  [@override](/user/override)
  String get databaseName => 'App.db';

  // 数据库版本
  [@override](/user/override)
  int get version => 1;

  // 创建你的表
  [@override](/user/override)
  FutureOr<void> onCreate(Database db, int version) async {
    /// 使用 [createTableStatement] 辅助函数创建表
    await db.execute(createTableStatement(tableName: 'User', fields: 'id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,email TEXT'));

    // 或者使用常规方式
    await db.execute('CREATE TABLE Normal_way (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,email TEXT);');

    /// [createTableStatement] 辅助函数,用于创建表
    createTableStatement(tableName: 'User', fields: 'id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,email TEXT');
  }
}

M7Table 类

M7Table 是一个辅助类,用于帮助创建表及其字段。M7Table 提供了几个帮助方法来处理开发者在使用sqflite时遇到的常见问题。

示例

首先,让我们看看在不扩展 M7Table 的情况下,数据类是什么样的。

class User {
  int id;
  String name;
  String email;
  bool isCompleted;
  DateTime date;
}

然后,让我们看看扩展后的样子:

class User extends M7Table {
  int? id;
  String? name;
  String? email;
  bool? isCompleted;
  DateTime? date;

  // 默认构造函数为 M7Table.create(),创建自己的构造函数时确保调用 super.create()
  User({this.id, this.name, this.email, this.isCompleted, this.date}) : super.create();

  // 此类的主键代表数据库的主键,这将用于Dao
  // 注意,如果传递给M7Table的主键在数据库中不是主键,它会在运行时抛出异常
  [@override](/user/override)
  get primaryKey => id;

  // 可选地与M7DAO一起使用,当覆盖它时告诉M7Dao如何将数据从数据库表示的形式转换为M7Table形式
  User.fromMap(Map map) : super.fromMap(map) {
    id = map['id'];
    name = map['name'];

    /// [intToBoolean] 将整数对象转换为布尔值,当从数据库获取数据时
    isCompleted = intToBoolean(map['isCompleted']);

    /// [intToDate] 将整数对象转换为日期时间,当从数据库获取数据时
    date = intToDate(map['date']);
  }

  // 用于M7DAO向数据库插入数据
  [@override](/user/override)
  Map<String, dynamic> toMap() => {
        "id": id,
        "name": name,

        /// [booleanToInt] 将布尔对象转换为整数,当保存数据到数据库时
        "isCompleted": booleanToInt(isCompleted!),

        /// [dateToInt] 将日期对象转换为整数,当保存数据到数据库时
        "date": dateToInt(date!),
      };

  // 可选,但作为良好实践,且此包也认为这是好的做法
  // 简单复制现有对象到新对象
  // 当执行操作如更新时,有助于快速复制现有实例
  [@override](/user/override)
  User copyWith({int? id, String? name, String? email, bool? isCompleted, DateTime? date}) {
    return User(
      id: id ?? this.id,
      name: name ?? this.name,
      email: email ?? this.email,
      isCompleted: isCompleted ?? this.isCompleted,
      date: date ?? this.date,
    );
  }
}

M7Dao 类

M7Dao 的实现很简单:

  1. 扩展 M7Dao
  2. 覆盖默认构造函数和 fromDB(Map) 方法

示例

class UserDao extends M7Dao<User> {
  // 必须覆盖
  UserDao(Database database, String tableName) : super(database, tableName);

  // 必须覆盖,可以简单地调用 .fromMap() 来从你的M7Table创建对象
  // 这将数据从数据库表示的形式转换为M7Table形式
  // 不限于M7Table的 fromMap() 构造函数,你可以做任何你想做的事情
  [@override](/user/override)
  User fromDB(Map<String, dynamic> map) => User.fromMap(map);

  // 可用的方法来自 M7Dao
}

现在,你可以使用它们了,见下面的示例:

void useM7Dao() async {
  AppDB appDB = AppDB();

  UserDao userDao = UserDao(await appDB.database, 'User');

  User user = User(id: 1, email: "Ali@gmail.com");

  // 按ID获取
  User? user1 = await userDao.getById('id');

  // 获取表中的所有列
  List<User> users = await userDao.getAll();

  // 插入多个实体
  await userDao.insertAll([user, user]);

  // 插入一个实体
  await userDao.insert(user);

  // 更新一个实体
  await userDao.update(user.copyWith(name: "Ali"));

  // 删除一个实体
  await userDao.delete(user);

  // 删除所有实体
  await userDao.deleteAll();

  /// [watchAll] 返回一个流,持续监控整个表
  /// 当调用继承的CRUD操作时(上述操作),它会自动更新流以反映最新的值
  userDao.watchAll().listen((event) {});

  // 关闭所有流
  userDao.dispose();

  // 你可以访问数据库并进行任何你需要的操作
  userDao.database;
}

M7Dao 与流

M7Dao 与流结合使用,并提供了一种保持数据库实时监控的方式。

示例

class UserDao extends M7Dao<User> {
  // 必须覆盖
  UserDao(Database database, String tableName) : super(database, tableName);

  // 必须覆盖,可以简单地调用 .fromMap() 来从你的Table创建对象
  // 这将数据从数据库表示的形式转换为M7Table形式
  [@override](/user/override)
  User fromDB(Map<String, dynamic> map) => User.fromMap(map);

  // 创建控制器
  StreamController _streamController = StreamController();

  void dealWithStreams() {
    // 告诉数据库你想从某个表达式执行流
    // 可以使用 watch() 函数来持续监控实时数据
    this.watch(
        _streamController,
        () => database.query(tableName, where: 'name = ?', whereArgs: ['ahmed']));

    // 这是为了更新刷新状态给监听者
    notifyListener();
  }

  // 可以创建自定义查询
  void makeMyOwnQuery() async {
    await this.database.execute('Custom Query ');

    // 不要忘记调用通知监听者,告诉M7Dao数据库发生了变化
    notifyListener();
  }

  void listen() {
    // 监听流,每当数据库发生变化,流将发出新的值
    _streamController.stream.listen((event) {});
  }

  [@override](/user/override)
  void dispose() {
    // 不要忘记关闭你的流并调用dispose()方法
    _streamController.close();
    super.dispose();
  }
}

更多关于Flutter数据库管理插件m7db的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库管理插件m7db的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


m7db 是一个用于 Flutter 的数据库管理插件,它提供了一种简单的方式来管理和操作 SQLite 数据库。虽然 m7db 并不是 Flutter 官方推荐的数据库管理插件(官方推荐的是 sqflite),但它仍然是一个不错的选择,尤其是在你需要快速上手和简化数据库操作的情况下。

以下是如何在 Flutter 项目中使用 m7db 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 m7db 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  m7db: ^0.0.1  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化数据库

在使用 m7db 之前,你需要初始化数据库。通常你可以在 main.dart 中完成这个操作。

import 'package:flutter/material.dart';
import 'package:m7db/m7db.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化数据库
  await M7DB.init();
  
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'M7DB Example',
      home: HomeScreen(),
    );
  }
}

3. 创建表

m7db 中,你可以通过创建一个类来表示数据库表,并使用注解来定义字段。

import 'package:m7db/m7db.dart';

@M7Table('users')
class User {
  @M7PrimaryKey()
  int id;

  @M7Field('name')
  String name;

  @M7Field('age')
  int age;

  User({this.id, this.name, this.age});
}

4. 插入数据

你可以使用 M7DB.insert() 方法来插入数据。

User user = User(name: 'John Doe', age: 30);
await M7DB.insert(user);

5. 查询数据

你可以使用 M7DB.query() 方法来查询数据。

List<User> users = await M7DB.query(User);
users.forEach((user) {
  print('User: ${user.name}, Age: ${user.age}');
});

6. 更新数据

你可以使用 M7DB.update() 方法来更新数据。

User user = users.first;
user.name = 'Jane Doe';
await M7DB.update(user);

7. 删除数据

你可以使用 M7DB.delete() 方法来删除数据。

await M7DB.delete(user);

8. 关闭数据库

在应用程序退出时,你可以选择关闭数据库连接。

await M7DB.close();
回到顶部