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

发布于 1周前 作者 caililin 来自 Flutter

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

Flutter Integration

Prisma ORM for Dart 允许你在Flutter项目中集成它。

Platform Support

Platform Support Notes
iOS
Android
macOS Prisma C-ABI not support
Linux Prisma C-ABI not support
Windows Prisma C-ABI not support
Web No plans at the moment

Database Support

Database Support Notes
Sqlite
MySQL/MariaDB Prisma C-ABI not support
PostgreSQL Prisma C-ABI not support
MongoDB Prisma C-ABI not support
Microsoft SQL Server Prisma C-ABI not support
CockroachDB Prisma C-ABI not support

Installation

你应该首先阅读安装文档,并按照orm包的设置Prisma ORM进行操作。 现在,让我们安装orm_flutter包,你可以使用命令行:

flutter pub add orm_flutter

或者编辑你的Flutter项目的pubspec.yaml文件:

dependencies:
  orm_flutter: latest

Integration

在你的Prisma模式(schema.prisma)中将你的生成器引擎类型设置为flutter:

generator client {
  provider   = "dart run orm"
  output     = "../lib/_generated_prisma_client"
  engineType = "flutter" // [!code focus]
}

Migrations

与服务器端不同,在Flutter中,数据库通常不由你通过Prisma CLI在构建前处理。

Create Migration File

创建迁移文件可以使用以下命令之一:

::: code-group

bun prisma migrate dev
npx prisma migrate dev
pnpx prisma migrate dev

:::

默认情况下,它会创建在prisma/migrations/文件夹中。

Set Migration Files to Flutter Assets

现在,让我们编辑你的pubspec.yaml:

flutter:
  assets:
    - prisma/migrations/ # Migrations root dir
    - prisma/migrations/<dir>/ # Set first migration files dir
    # ... More assets

每个使用prisma migrate dev命令生成的迁移文件夹都需要添加。

Run Migration

final engine = prisma.$engine as LibraryEngine;

await engine.applyMigrations(
     path: 'prisma/migrations/', // You define in `flutter.assets` migrations root dir
);

除了使用flutter.assets,你可以自定义AssetBundle来实现:

await engine.applyMigrations(
  path: '<Your migration dir prefix>',
  bundle: <You custon bundle>,
);

此外,engine.applyMigrations可能会抛出异常。这通常是由于你对迁移文件进行了破坏性更改,你应该自己处理这个问题。最常用的方法是在抛出异常后删除数据库文件,然后重新运行迁移。

如果你是添加新的迁移,则几乎不会有问题。

Complete Integration Example

在这个示例中,我们将安装以下包:

我们将在<Application Support Directory>/database.sqlite位置安装数据库,然后使用flutter.assets来运行迁移

::: code-group

import 'package:flutter/widgets.dart';
import 'package:orm_flutter/orm_flutter.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';

import '_generated_prisma_client/client.dart';

late final PrismaClient prisma;

Future<void> initPrismaClient() async {
  WidgetsFlutterBinding.ensureInitialized();

  final supportDir = await getApplicationSupportDirectory();
  final database = join(supportDir.path, 'database.sqlite.db');

  prisma = PrismaClient(datasourceUrl: 'file:$database');
  final engine = switch (prisma.$engine) {
    LibraryEngine engine => engine,
    _ => null,
  };

  await prisma.$connect();
  await engine?.applyMigrations(path: 'prisma/migrations');
}

import 'prisma.dart';

Future<void> main() async {
     await initPrismaClient();

     // ...
}

:::

Example App

我们为你提供了一个集成了Prisma ORM的Flutter demo App 👉 Flutter with ORM

FAQ

Error (Xcode): Undefined symbol: prisma_*

这是由于库编译失败引起的,即使你下载了新的修复版本,问题仍然存在。 解决方案:运行以下命令:

flutter clean

Other Unknown Error Solutions:

大多数问题可以通过以下命令组合解决:

flutter clean # 清理flutter缓存文件
flutter pub get # 重新安装依赖
<bun/npx/pnpx/yarn> prisma generate # 重新生成prisma客户端

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

1 回复

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


当然,以下是一个关于如何使用Flutter对象关系映射插件 orm_flutter 的代码示例。这个示例展示了如何定义模型、配置数据库以及执行基本的CRUD(创建、读取、更新、删除)操作。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  orm_flutter: ^最新版本号 # 请替换为最新版本号

2. 创建模型类

接下来,定义一个模型类。假设我们要创建一个 User 模型。

import 'package:orm_flutter/orm_flutter.dart';

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

  @Column()
  String name;

  @Column()
  int age;

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

  @override
  String toString() {
    return 'User{id: $id, name: $name, age: $age}';
  }
}

3. 配置数据库

在你的应用入口(例如 main.dart)中配置数据库。

import 'package:flutter/material.dart';
import 'package:orm_flutter/orm_flutter.dart';
import 'user_model.dart'; // 假设你的模型类文件名为 user_model.dart

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 配置数据库
    DatabaseConfig dbConfig = DatabaseConfig(
      databaseName: 'my_database.db',
      version: 1,
    );

    // 注册模型
    ORMFlutter.registerModel(User());

    // 初始化数据库
    ORMFlutter.initialize(dbConfig).then((database) {
      // 数据库初始化完成后,你可以在这里启动你的应用
      runZonedGuarded(() {
        runApp(MaterialApp(
          home: MyHomePage(),
        ));
      }, (error, stackTrace) {
        // 错误处理
        print('Error: $error');
        print('Stack Trace: $stackTrace');
      });
    });

    return Container(); // 在数据库初始化完成前显示一个空的容器
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ORM Flutter Demo'),
      ),
      body: Center(
        child: Text('Check the console for CRUD operations results'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          // 示例:执行CRUD操作
          await performCRUDOperations();
        },
        tooltip: 'Perform CRUD',
        child: Icon(Icons.add),
      ),
    );
  }

  Future<void> performCRUDOperations() async {
    // 创建
    User user = User(name: 'Alice', age: 30);
    await user.save();
    print('Created: $user');

    // 读取
    List<User> users = await User.findAll();
    print('Read all: $users');

    // 更新
    User firstUser = users.first;
    firstUser.age = 31;
    await firstUser.save();
    print('Updated: $firstUser');

    // 删除
    await firstUser.delete();
    print('Deleted: ${firstUser.id}');

    // 再次读取以验证删除
    users = await User.findAll();
    print('Read all after delete: $users');
  }
}

4. 运行应用

确保你的开发环境已经配置好,然后运行你的Flutter应用。点击浮动操作按钮(FAB)来执行CRUD操作,并在控制台中查看结果。

这个示例展示了如何使用 orm_flutter 插件进行基本的数据库操作。根据你的具体需求,你可以进一步扩展这个示例,例如添加更多的模型、处理复杂的关系、执行更复杂的查询等。

回到顶部