Flutter中如何实现SQLite的bean映射

在Flutter中使用SQLite时,如何将数据库表的数据映射到Dart的bean类?目前我创建了数据库表和对应的bean类,但每次查询都需要手动解析字段,比较繁琐。是否有类似Android中Room的自动映射方案?或者推荐哪些第三方库可以实现这个功能?最好能提供简单的代码示例说明如何配置和使用。

2 回复

在Flutter中,使用sqflite库操作SQLite时,可通过以下方式实现bean映射:

  1. 创建模型类,定义字段和toMap()fromMap()方法。
  2. 使用json_annotationjson_serializable自动生成序列化代码。
  3. 在数据库操作中调用这些方法进行对象与Map的转换。

示例:

class User {
  final int id;
  final String name;

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

  Map<String, dynamic> toMap() {
    return {'id': id, 'name': name};
  }

  factory User.fromMap(Map<String, dynamic> map) {
    return User(id: map['id'], name: map['name']);
  }
}

更多关于Flutter中如何实现SQLite的bean映射的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现SQLite的bean映射(对象关系映射,ORM)可以通过以下步骤完成,推荐使用sqflite库结合手动映射或第三方ORM库来简化操作:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  sqflite: ^2.0.0+4
  path: ^1.8.0

2. 创建Bean类

定义一个Dart类(例如User),包含字段和toMap/fromMap方法:

class User {
  final int? id;
  final String name;
  final int age;

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

  // 转换为Map(用于插入/更新数据库)
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }

  // 从Map解析(用于查询数据)
  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  }
}

3. 数据库操作

创建数据库帮助类,实现增删改查:

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHelper {
  static final _databaseName = "my_database.db";
  static final _databaseVersion = 1;

  static final table = 'users';
  static final columnId = 'id';
  static final columnName = 'name';
  static final columnAge = 'age';

  // 单例模式
  static Database? _database;
  Future<Database> get database async {
    _database ??= await _initDatabase();
    return _database!;
  }

  _initDatabase() async {
    String path = join(await getDatabasesPath(), _databaseName);
    return await openDatabase(
      path,
      version: _databaseVersion,
      onCreate: _onCreate,
    );
  }

  // 创建表
  Future _onCreate(Database db, int version) async {
    await db.execute('''
      CREATE TABLE $table (
        $columnId INTEGER PRIMARY KEY AUTOINCREMENT,
        $columnName TEXT NOT NULL,
        $columnAge INTEGER NOT NULL
      )
    ''');
  }

  // 插入用户
  Future<int> insertUser(User user) async {
    Database db = await database;
    return await db.insert(table, user.toMap());
  }

  // 查询所有用户
  Future<List<User>> getUsers() async {
    Database db = await database;
    List<Map> maps = await db.query(table);
    return maps.map((map) => User.fromMap(map as Map<String, dynamic>)).toList();
  }
}

4. 使用ORM库(可选)

如需更高级功能,可使用以下库简化操作:

  • Floor: 提供注解驱动的ORM(推荐)
    1. 添加依赖:
    dependencies:
      floor: ^1.4.0
    dev_dependencies:
      floor_generator: ^1.4.0
      build_runner: ^2.1.0
    
    1. 使用注解定义实体和DAO,通过build_runner生成代码。

总结

  • 手动映射:灵活可控,适合简单需求。
  • ORM库:减少样板代码,适合复杂项目。

根据项目复杂度选择合适方案即可。

回到顶部