Flutter数据库生成插件sqflite_generator的使用

Flutter数据库生成插件sqflite_generator的使用

在Flutter中使用数据库时,sqflite插件是一个非常流行的选择。然而,当你的数据库结构变得复杂时,手动编写所有的CRUD(创建、读取、更新、删除)操作可能会变得繁琐且容易出错。这时,sqflite_generator插件可以帮助你自动生成这些操作代码,从而提高开发效率。

安装依赖

首先,在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4
  path_provider: ^2.0.9
  sqflite_generator: ^0.2.0
  build_runner: ^2.1.7

然后运行flutter pub get以安装这些依赖。

创建数据库模型

假设我们要创建一个简单的用户表,包含idnameemail字段。首先,我们需要定义一个数据模型类:

import 'package:sqflite/sqflite.dart';

class User {
  int? id;
  String name;
  String email;

  User({this.id, required this.name, required this.email});

  // 将User对象转换为Map对象
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'email': email,
    };
  }

  // 从Map对象创建User对象
  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      email: map['email'],
    );
  }
}

生成数据库操作代码

接下来,我们需要创建一个用于生成数据库操作代码的文件。我们可以在项目根目录下创建一个名为generate.dart的文件,并编写以下代码:

import 'package:path/path.dart' as p;
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_generator/sqflite_generator.dart';

void main() async {
  final databasePath = await getDatabasesPath();
  final dbPath = p.join(databasePath, 'my_database.db');

  // 初始化数据库
  Database database = await openDatabase(dbPath, version: 1,
      onCreate: (db, version) async {
    // 在这里定义表结构
    await db.execute('''
      CREATE TABLE user (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL
      )
    ''');
  });

  // 生成数据库操作代码
  SqfliteGenerator().generate(database, [
    User.toMap(), // 添加所有需要生成的方法
    User.fromMap,
  ]);

  // 关闭数据库连接
  await database.close();
}

在终端中运行以下命令来生成代码:

flutter packages pub run build_runner build

这将生成一个名为sqflite_operations.g.dart的文件,其中包含了所有你需要的CRUD操作方法。

使用生成的代码

现在你可以直接在你的应用中使用生成的代码了。例如,你可以这样插入一条记录:

import 'sqflite_operations.g.dart';

void insertUser(User user) async {
  final databasePath = await getDatabasesPath();
  final dbPath = p.join(databasePath, 'my_database.db');
  final database = await openDatabase(dbPath);

  await insert<User>(database, user);
  await database.close();
}

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

1 回复

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


sqflite_generator 是一个用于生成 Flutter 应用中 SQLite 数据库相关代码的插件。它可以帮助你自动生成数据库表、DAO(数据访问对象)以及模型类,从而减少手动编写重复代码的工作量。

以下是使用 sqflite_generator 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+4

dev_dependencies:
  build_runner: ^2.1.0
  sqflite_generator: ^2.0.0

2. 创建数据库表模型

你需要创建一个 Dart 类来表示数据库中的表。这个类应该使用 @Entity 注解来标记,并且使用 @Column 注解来标记表的列。

import 'package:sqflite_generator/annotation.dart';

@Entity(tableName: 'user')
class User {
  @PrimaryKey(autoGenerate: true)
  int id;

  @Column(name: 'name')
  String name;

  @Column(name: 'age')
  int age;

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

3. 生成代码

在终端中运行以下命令来生成数据库相关的代码:

flutter pub run build_runner build

这将会生成一个与你的模型类对应的数据库访问对象(DAO)和数据库帮助类。

4. 使用生成的代码

生成的代码会包含一个 Database 类和 DAO 类。你可以使用这些类来执行数据库操作。

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'generated/database.g.dart'; // 生成的代码

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();

  factory DatabaseHelper() {
    return _instance;
  }

  DatabaseHelper._internal();

  static Database _database;

  Future<Database> get database async {
    if (_database != null) return _database;
    _database = await _initDatabase();
    return _database;
  }

  Future<Database> _initDatabase() async {
    String path = join(await getDatabasesPath(), 'app_database.db');
    return await openDatabase(
      path,
      version: 1,
      onCreate: _onCreate,
    );
  }

  Future<void> _onCreate(Database db, int version) async {
    await db.execute('''
      CREATE TABLE user (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,
        age INTEGER
      )
    ''');
  }

  Future<void> insertUser(User user) async {
    final db = await database;
    await db.insert('user', user.toMap());
  }

  Future<List<User>> getUsers() async {
    final db = await database;
    final List<Map<String, dynamic>> maps = await db.query('user');
    return List.generate(maps.length, (i) {
      return User(
        id: maps[i]['id'],
        name: maps[i]['name'],
        age: maps[i]['age'],
      );
    });
  }
}

5. 在应用中使用数据库

你可以在你的应用中使用 DatabaseHelper 类来执行数据库操作。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final dbHelper = DatabaseHelper();

  await dbHelper.insertUser(User(name: 'John Doe', age: 30));

  List<User> users = await dbHelper.getUsers();
  print(users);
}
回到顶部