Flutter数据库管理插件m7db的使用
Flutter数据库管理插件m7db的使用
m7db
是一个简单的Dart包,旨在简化在Flutter项目中使用sqflite的方式。它的主要目的是:
- 提供一个抽象的数据访问对象(DAO)类,该类提供了CRUD操作及一些常见的事务。
- 移除每个项目中重复的代码。
- 提供处理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
包含三个主要类:M7DB
、M7Table
和 M7Dao
。你需要扩展这三个类,以便它们能协同工作。这三类试图移除冗余代码,并提供帮助函数。
1. M7DB 类
M7DB
将为你创建数据库。它还提供了一些辅助方法,例如 createTableStatement()
。
示例
要使用它,你应该扩展 M7DB
。
M7DB
强制你覆盖以下内容:
databaseName
获取器onCreate
函数将在数据库初始化时被调用(非常适合创建你的表)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
的实现很简单:
- 扩展
M7Dao
- 覆盖默认构造函数和
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
更多关于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();