Flutter对象关系映射插件flat_orm的使用

Flutter对象关系映射插件flat_orm的使用

Flat (基于Floor)

Flat为您的Flutter应用程序提供了简洁的SQLite抽象层,灵感来源于Android的Room持久化库。它通过自动将内存中的对象与数据库行进行映射,同时仍然提供完整的数据库控制(使用SQL),从而实现了这一目标。因此,要充分利用Flat的功能,您需要了解SQL和SQLite。

  • 零安全
  • 类型安全
  • 响应式
  • 轻量级
  • 以SQL为中心
  • 没有隐藏的魔法
  • 没有隐藏的成本
  • 支持iOS、Android、Linux、macOS和Windows

⚠️ 该库欢迎贡献! 有关问题、想法和讨论,请参阅GitHub Discussions

入门指南

1. 设置依赖项

pubspec.yaml文件中添加运行时依赖flat_orm以及生成器flat_generator。第三个依赖项是build_runner,它必须作为开发依赖项包含在内,就像生成器一样。

  • flat_orm包含您应用中要用到的所有代码。
  • flat_generator包括生成数据库类的代码。
  • build_runner允许生成源代码文件的具体方式。
dependencies:
  flutter:
    sdk: flutter
  flat_orm: ^1.6.0

dev_dependencies:
  flat_generator: ^1.6.3
  build_runner: ^2.1.2

对于实验性Web支持,请在项目中运行以下命令:

dart run sqflite_common_ffi_web:setup

2. 创建一个实体

这将代表数据库表以及业务对象的框架。@entity标记类为持久化类。需要向表中添加主键。可以通过向int属性添加@primaryKey注解来实现这一点。实体文件的位置不受限制。

// entity/person.dart

import 'package:flat_orm/flat_orm.dart';

@entity
class Person {
  @primaryKey
  final int id;

  final String name;

  Person(this.id, this.name);
}

3. 创建一个DAO(数据访问对象)

此组件负责管理对底层SQLite数据库的访问。抽象类包含查询数据库的方法签名,这些方法必须返回FutureStream

  • 可以通过向方法添加@Query注解来定义查询。SQL语句必须添加在括号中。方法必须返回所查询EntityFutureStream
  • @insert标记方法为插入方法。
// dao/person_dao.dart

import 'package:flat_orm/flat_orm.dart';

@dao
abstract class PersonDao {
  @Query('SELECT * FROM Person')
  Future<List<Person>> findAllPersons();

  @Query('SELECT * FROM Person WHERE id = :id')
  Stream<Person?> findPersonById(int id);

  @insert
  Future<void> insertPerson(Person person);
}

4. 创建数据库

数据库必须是一个扩展了FlatDatabase的抽象类。还需要向类的签名添加@Database()。确保将创建的实体添加到@Database注解的entities属性中。为了使生成的代码工作,还需要添加列出的导入。

确保在文件的导入部分下方添加part 'database.g.dart';。请注意,'database’必须替换为数据库定义文件的名称。在这个例子中,文件名为database.dart

// database.dart

// 必需的包导入
import 'dart:async';
import 'package:flat_orm/flat_orm.dart';
import 'package:sqflite/sqflite.dart' as sqflite;

import 'dao/person_dao.dart';
import 'entity/person.dart';

part 'database.g.dart'; // 生成的代码将在这里

@Database(version: 1, entities: [Person])
abstract class AppDatabase extends FlatDatabase {
  PersonDao get personDao;
}

5. 运行代码生成器

使用flutter packages pub run build_runner build运行生成器。为了在每次文件更改时自动运行它,请使用flutter packages pub run build_runner watch

6. 使用生成的代码

为了获取数据库实例,可以使用生成的$FlatAppDatabase类,该类允许访问数据库构建器。名称由$Flat和数据库类名组成。传递给databaseBuilder()的字符串将是数据库文件名。初始化数据库时,调用build()并确保等待结果。

为了检索PersonDao实例,只需在数据库实例上调用personDao即可。其功能如以下代码片段所示。

final database = await $FlatAppDatabase.databaseBuilder('app_database.db').build();

final personDao = database.personDao;
final person = Person(1, 'Frank');

await personDao.insertPerson(person);
final result = await personDao.findPersonById(1);

对于更多示例,请查看示例目录测试目录

命名

就像Floor一样,Flat也是Room(Room是以“fl”开头的另一个词)的一个相关词。

Bug、想法和反馈

如发现bug,请使用GitHub Issues报告。 对于问题、想法和讨论,请使用GitHub Discussions

许可证

Copyright 2022 The Flat and The Floor Project Authors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

更多关于Flutter对象关系映射插件flat_orm的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter对象关系映射插件flat_orm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用flat_orm插件来进行对象关系映射(ORM)的代码示例。flat_orm是一个轻量级的Flutter ORM库,它允许你以面向对象的方式操作SQLite数据库。

首先,确保你已经在pubspec.yaml文件中添加了flat_orm依赖:

dependencies:
  flutter:
    sdk: flutter
  flat_orm: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,我们将展示如何使用flat_orm来定义一个模型、创建数据库、插入数据以及查询数据。

1. 定义模型

首先,定义一个数据模型。例如,我们定义一个User模型:

import 'package:flat_orm/flat_orm.dart';

@Entity(tableName: 'users')
class User extends Model {
  @Column(primaryKey: true, autoGenerate: true)
  int id;

  @Column(notNull: true)
  String name;

  @Column(notNull: true)
  String email;
}

2. 创建数据库并打开连接

接下来,我们需要创建一个数据库并打开连接。通常在应用的入口文件(如main.dart)中完成这一操作:

import 'package:flutter/material.dart';
import 'package:flat_orm/flat_orm.dart';
import 'user_model.dart'; // 假设你将User模型放在user_model.dart文件中

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

  // 创建数据库并打开连接
  final db = await Database.create(
    path: 'example.db',
    version: 1,
    entities: [User], // 注册User模型
  );

  // 运行应用
  runApp(MyApp(db: db));
}

class MyApp extends StatelessWidget {
  final Database db;

  MyApp({required this.db});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flat ORM Example'),
        ),
        body: Center(
          child: MyHomePage(db: db),
        ),
      ),
    );
  }
}

3. 插入数据

现在,我们可以在一个页面(如MyHomePage)中插入数据:

import 'package:flutter/material.dart';
import 'package:flat_orm/flat_orm.dart';
import 'user_model.dart';

class MyHomePage extends StatefulWidget {
  final Database db;

  MyHomePage({required this.db});

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    _insertUser();
  }

  Future<void> _insertUser() async {
    final user = User()
      ..name = 'John Doe'
      ..email = 'john.doe@example.com';

    await user.save(widget.db);
    print('User saved with ID: ${user.id}');
  }

  @override
  Widget build(BuildContext context) {
    return Text('Check the console for user ID after insertion.');
  }
}

4. 查询数据

同样地,我们可以在一个方法中查询数据:

Future<void> _queryUsers() async {
  final users = await User.queryAll(widget.db);
  users.forEach((user) {
    print('User ID: ${user.id}, Name: ${user.name}, Email: ${user.email}');
  });
}

你可以将这个查询方法添加到_MyHomePageState类中,并在需要时调用它,例如在按钮点击事件中。

完整示例

将上述所有部分整合在一起,你可能会得到一个如下所示的完整示例:

import 'package:flutter/material.dart';
import 'package:flat_orm/flat_orm.dart';
import 'user_model.dart';

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

  final db = await Database.create(
    path: 'example.db',
    version: 1,
    entities: [User],
  );

  runApp(MyApp(db: db));
}

class MyApp extends StatelessWidget {
  final Database db;

  MyApp({required this.db});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flat ORM Example'),
        ),
        body: Center(
          child: MyHomePage(db: db),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final Database db;

  MyHomePage({required this.db});

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    _insertUser();
    _queryUsers(); // 可以在插入后立即查询,或者根据需要调用
  }

  Future<void> _insertUser() async {
    final user = User()
      ..name = 'John Doe'
      ..email = 'john.doe@example.com';

    await user.save(widget.db);
    print('User saved with ID: ${user.id}');
  }

  Future<void> _queryUsers() async {
    final users = await User.queryAll(widget.db);
    users.forEach((user) {
      print('User ID: ${user.id}, Name: ${user.name}, Email: ${user.email}');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text('Check the console for user details.');
  }
}

这个示例展示了如何使用flat_orm在Flutter中进行基本的ORM操作。你可以根据需要扩展和修改这个示例来适应你的应用需求。

回到顶部