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

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

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

Prisma Client Dart

Pub Version GitHub License Docs website GitHub Sponsors Open Collective sponsors Discord X (formerly Twitter) Follow

Prisma Client Dart 是一个自动生成类型安全的ORM(对象关系映射)。它使用Prisma Engine作为数据访问层,并尽可能与Prisma Client JS/TS API保持一致。

👉 了解如何在您的项目中使用Prisma ORM for Dart

示例代码

import 'package:orm/orm.dart';

final client = PrismaClient();

main() async {
  final users = await client.user.findMany();
  print(users);
}

安装

这将添加如下内容到你的pubspec.yaml文件(并隐式运行dart pub get):

dependencies:
  orm: latest

或者你可以运行以下命令:

dart pub add orm

文档

你可以在网站上找到Prisma Client Dart的文档。

文档分为以下几个部分:

你可以通过向main分支的docs文件夹发送pull请求来改进文档。

示例

你还可以在main分支的example文件夹中找到示例。

Query Engine 支持矩阵

Engine Dart Native Dart Web Flutter Native Flutter Web
Binary
Library
Data Proxy

贡献

我们欢迎贡献!请阅读我们的贡献指南,以了解我们的开发过程、如何提出bug修复和改进建议,以及如何构建和测试你对Prisma的更改。

感谢所有已经为Prisma Dart做出贡献的人!

Contributors

行为准则

本项目已采用贡献者契约行为准则。更多信息请参阅行为准则FAQ,或联系hello@odroe.com以获取更多问题或评论。

完整示例Demo

下面是一个完整的示例demo,展示了如何在Flutter项目中使用Prisma Client Dart进行基本的CRUD操作。

1. 创建一个新的Flutter项目

flutter create prisma_example
cd prisma_example

2. 添加依赖

pubspec.yaml中添加Prisma Client Dart依赖:

dependencies:
  flutter:
    sdk: flutter
  orm: latest

然后运行dart pub get以安装依赖。

3. 配置Prisma Schema

创建一个名为schema.prisma的文件,并添加以下内容:

generator client {
  provider = "prisma-client-dart"
}

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
}

4. 生成Prisma Client

运行以下命令以生成Prisma Client:

npx prisma generate

5. 编写Flutter代码

lib/main.dart中编写以下代码:

import 'package:flutter/material.dart';
import 'package:orm/orm.dart';

void main() async {
  final client = PrismaClient();
  runApp(MyApp(client));
}

class MyApp extends StatelessWidget {
  final PrismaClient client;

  MyApp(this.client);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Prisma Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(client),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final PrismaClient client;

  MyHomePage(this.client);

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

class _MyHomePageState extends State<MyHomePage> {
  List<User> users = [];

  @override
  void initState() {
    super.initState();
    _fetchUsers();
  }

  Future<void> _fetchUsers() async {
    final fetchedUsers = await widget.client.user.findMany();
    setState(() {
      users = fetchedUsers;
    });
  }

  Future<void> _addUser(String email, String name) async {
    await widget.client.user.create(
      data: UserCreateInput(email: email, name: name),
    );
    _fetchUsers();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Prisma Example'),
      ),
      body: ListView.builder(
        itemCount: users.length,
        itemBuilder: (context, index) {
          final user = users[index];
          return ListTile(
            title: Text(user.name ?? 'No Name'),
            subtitle: Text(user.email),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          showDialog(
            context: context,
            builder: (context) => AlertDialog(
              title: Text('Add User'),
              content: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  TextField(
                    decoration: InputDecoration(labelText: 'Email'),
                    onChanged: (value) => email = value,
                  ),
                  TextField(
                    decoration: InputDecoration(labelText: 'Name'),
                    onChanged: (value) => name = value,
                  ),
                ],
              ),
              actions: [
                TextButton(
                  child: Text('Cancel'),
                  onPressed: () => Navigator.pop(context),
                ),
                TextButton(
                  child: Text('Add'),
                  onPressed: () {
                    _addUser(email, name);
                    Navigator.pop(context);
                  },
                ),
              ],
            ),
          );
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

6. 运行应用程序

确保你已经安装了SQLite,并且数据库文件路径正确。然后运行以下命令启动应用程序:

flutter run

现在你应该可以看到一个简单的用户管理界面,可以添加和查看用户。

希望这个示例能帮助你更好地理解和使用Prisma Client Dart。如果你有任何问题或需要进一步的帮助,请随时参考官方文档或加入社区讨论。


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

1 回复

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


在Flutter中,对象关系映射(ORM)插件可以帮助开发者以面向对象的方式操作数据库,从而简化数据持久化的过程。一个流行的Flutter ORM插件是floor。下面是一个使用floor插件的示例代码案例,展示了如何进行基本的CRUD(创建、读取、更新、删除)操作。

1. 添加依赖

首先,在pubspec.yaml文件中添加floor依赖:

dependencies:
  flutter:
    sdk: flutter
  floor: ^1.0.0  # 请确保使用最新版本

dev_dependencies:
  build_runner: ^2.0.0
  floor_generator: ^1.0.0  # 与floor版本匹配

2. 创建数据模型

创建一个数据模型类,并使用@Entity注解标记它。同时,使用@ColumnInfo注解标记字段。

import 'package:floor/floor.dart';

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

  @ColumnInfo(name: 'name')
  final String name;

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

3. 创建DAO接口

定义一个数据访问对象(DAO)接口,用于定义数据库操作。

import 'package:floor/floor.dart';
import 'user.dart';

@Dao
abstract class UserDao {
  @Query('SELECT * FROM users')
  Future<List<User>> findAllUsers();

  @Insert(onConflict: OnConflictStrategy.replace)
  Future<void> insertUser(User user);

  @Update(onConflict: OnConflictStrategy.replace)
  Future<void> updateUser(User user);

  @Delete
  Future<void> deleteUser(User user);
}

4. 定义数据库

创建一个数据库类,并使用@Database注解标记它,同时指定DAO接口。

import 'package:floor/floor.dart';
import 'user_dao.dart';
import 'user.dart';

@Database(version: 1, entities: [User])
abstract class AppDatabase extends FloorDatabase {
  UserDao get userDao;
}

5. 生成数据库代码

在项目根目录下运行以下命令以生成数据库代码:

flutter pub run build_runner build

6. 使用数据库

在应用中使用生成的数据库实例进行CRUD操作。

import 'package:flutter/material.dart';
import 'package:your_app_name/database/app_database.dart';
import 'package:your_app_name/models/user.dart';
import 'package:sqflite/sqflite.dart' as sqflite;

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

  // 打开数据库连接(注意:floor内部处理,这里仅为了演示)
  final database = await $FloorAppDatabase.databaseBuilder('your_database_name.db').build();
  final userDao = database.userDao;

  runApp(MyApp(userDao: userDao, database: database));
}

class MyApp extends StatelessWidget {
  final UserDao userDao;
  final AppDatabase database;

  MyApp({required this.userDao, required this.database});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Floor ORM Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 插入用户
              final user = User(name: 'John Doe');
              await userDao.insertUser(user);

              // 读取用户
              final users = await userDao.findAllUsers();
              print(users);

              // 更新用户
              user.name = 'Jane Doe';
              await userDao.updateUser(user);

              // 删除用户
              await userDao.deleteUser(user);

              // 关闭数据库(floor内部处理连接池,这里仅为了演示)
              await database.close();
            },
            child: Text('Perform Database Operations'),
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 数据库升级:如果数据库结构发生变化(例如添加新字段),需要增加版本号并处理迁移逻辑。
  2. 异常处理:在实际应用中,应该添加异常处理逻辑以处理可能的数据库错误。
  3. 依赖注入:对于更复杂的应用,考虑使用依赖注入框架(如providerget_it)来管理数据库实例。

这个示例展示了如何使用floor插件在Flutter应用中进行基本的对象关系映射操作。根据你的具体需求,你可以进一步扩展这个基础代码。

回到顶部