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

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

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

警告

我们宣布在2024年9月停止支持Atlas Device Sync + Realm SDKs。如果您需要没有同步功能的realm-dart版本,请安装版本20或查看community分支。

介绍

Realm 是一个直接运行在手机、平板或可穿戴设备上的移动数据库。该仓库包含用于Flutter™和Dart™的Realm SDK的源代码。

功能

  • 移动端优先:Realm 是第一个从头开始构建以直接运行在手机、平板和可穿戴设备上的数据库。
  • 简单:Realm 的面向对象数据模型易于学习,不需要ORM,并且API可以让您在几分钟内编写更少的代码来启动和运行应用程序。
  • 现代:Realm 支持最新的Dart和Flutter版本,并具有健全的空安全机制。
  • 快速:Realm 在常见操作中比原始SQLite更快,同时保持极其丰富的功能集。
  • MongoDB Atlas Device Sync:可以轻松地在用户、设备和后端之间实时同步数据。您可以免费使用模板应用程序并创建云后端。

入门指南

1. 导入Realm

在Dart文件(如app.dart)中导入Realm包,并声明一个部分文件:

import 'package:realm/realm.dart';  // 导入realm包

part 'app.realm.dart'; // 声明一个部分文件

@RealmModel() // 定义一个名为`_Car`的数据模型类
class _Car {
  late String make;

  late String model;

  int? kilometers = 500;
}

2. 生成RealmObject类

从数据模型类_Car生成RealmObject类Car

dart run realm generate

3. 打开Realm并添加对象

创建一个配置对象并打开一个Realm实例,然后添加一些对象:

var config = Configuration.local([Car.schema]);
var realm = Realm(config);

var car = Car("Tesla", "Model Y", kilometers: 5);
realm.write(() {
  realm.add(car);
});

4. 查询Realm中的对象

查询Realm中的对象并进行过滤:

var cars = realm.all<Car>();
Car myCar = cars[0];
print("My car is ${myCar.make} model ${myCar.model}");

cars = realm.all<Car>().query("make == 'Tesla'");

5. 获取查询结果的变化流

获取查询结果的变化流并监听变化:

final cars = realm.all<Car>().query(r'make == $0', ['Tesla']);
cars.changes.listen((changes) {
  print('Inserted indexes: ${changes.inserted}');
  print('Deleted indexes: ${changes.deleted}');
  print('Modified indexes: ${changes.modified}');
});
realm.write(() => realm.add(Car('VW', 'Polo', kilometers: 22000)));

示例代码

以下是一个完整的示例代码,展示了如何使用realm_generator生成Realm对象并在Flutter应用中使用它们。

catalog.dart

import 'package:realm/realm.dart';

part 'catalog.realm.dart';

// 定义一个数据模型类
@RealmModel()
class _Item {
  @PrimaryKey()
  late int id;

  late String name;

  int price = 42;
}

void main() {
  // 创建一个配置对象
  var config = Configuration.local([Item.schema]);

  // 打开一个Realm
  var realm = Realm(config);

  // 创建一个Item对象
  var myItem = Item(0, 'Pen', price: 4);

  // 打开一个写事务
  realm.write(() {
    realm.add(myItem);
    var item = realm.add(Item(1, 'Pencil')..price = 20);
  });

  // 对象`myItem`和`item`现在由Realm管理并持久化
  print("Added items to realm");

  // 读取对象属性
  print("Item name: ${myItem.name}");
  print("Item price: ${myItem.price}");

  // 更新对象属性
  realm.write(() {
    myItem.price = 20;
    myItem.name = "Special Pencil";
  });

  // 获取所有Item对象
  var items = realm.all<Item>();

  // 通过索引获取对象
  var item = items[1];

  // 通过主键获取对象
  var itemByKey = realm.find<Item>(0);

  // 过滤和排序对象
  var objects = realm.query<Item>("name == 'Special Pencil'");
  var name = 'Pen';
  objects = realm.query<Item>(r'name == $0', [name]);

  // 关闭Realm
  realm.close();
}

环境设置

1. 添加realm

在Flutter应用中添加realm包:

flutter pub add realm

2. 安装所需的本地二进制文件

为运行Flutter小部件和单元测试,安装所需的本地二进制文件:

dart run realm install

3. 导入Realm

在Dart文件(如catalog.dart)中导入Realm包:

import 'package:realm/realm.dart';

4. 声明部分文件

catalog.dart文件的开头声明一个部分文件catalog.realm.dart

import 'dart:io';

part 'catalog.realm.dart';

5. 创建数据模型类

创建一个以下划线开头的数据模型类,并使用@RealmModel()注解:

@RealmModel()
class _Item {
  @PrimaryKey()
  late int id;

  late String name;

  int price = 42;
}

6. 生成RealmObject类

从数据模型类_Item生成RealmObject类Item

dart run realm generate

生成的文件catalog.realm.dart将与catalog.dart文件相邻创建。请将生成的文件提交到源代码控制中。

使用Device Sync同步数据

1. 设置Atlas App Services

  1. cloud.mongodb.com上创建一个账户。
  2. 按照说明创建一个新的应用程序。
  3. 配置适当的认证提供程序类型。
  4. 启用Flexible Sync。
  5. 复制新应用程序的App ID。

2. 使用Device Sync

  1. 初始化App Services客户端并认证用户:
String appId = "<Atlas App ID>";
final appConfig = AppConfiguration(appId);
final app = App(appConfig);
final user = await app.logIn(Credentials.anonymous());
  1. 打开一个同步的Realm:
final config = Configuration.flexibleSync(user, [Task.schema]);
final realm = Realm(config);
  1. 添加同步订阅并写入数据:
realm.subscriptions.update((mutableSubscriptions) {
  mutableSubscriptions.add(realm.query<Task>(r'status == $0 AND progressMinutes == $1', ["completed", 100]));
});
await realm.subscriptions.waitForSynchronization();
realm.write(() {
  realm.add(Task(ObjectId(), "Send an email", "completed", 4));
  realm.add(Task(ObjectId(), "Create a meeting", "completed", 100));
  realm.add(Task(ObjectId(), "Call the manager", "init", 2));
});
realm.close();

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用realm_generator插件来生成Realm数据库相关代码的示例。realm_generator插件能够帮助你简化Realm数据库模型的创建过程,通过注解自动生成Realm所需的代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  realm: ^10.7.0  # 请使用最新版本

dev_dependencies:
  build_runner: ^2.1.4
  realm_generator: ^0.1.0  # 请使用最新版本

2. 创建Realm模型

接下来,在你的Flutter项目中创建一个Realm模型。假设我们要创建一个简单的User模型:

// models/user_model.dart

import 'package:realm/annotations.dart';

@RealmModel()
class User {
  @PrimaryKey()
  @Required()
  String id = '';

  String name = '';
  int age = 0;
}

3. 生成Realm代码

在项目的根目录下,运行以下命令以生成Realm所需的代码:

flutter pub run build_runner build --delete-conflicting-outputs

这个命令会根据注解生成必要的Realm模型代码。

4. 配置Realm实例

在你的Flutter应用的入口文件(例如main.dart)中配置Realm实例:

// main.dart

import 'package:flutter/material.dart';
import 'package:realm/realm.dart';
import 'models/user_model.dart';

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

  // 初始化Realm配置
  await Realm.init(configuration: RealmConfiguration(
    schemaVersion: 0,  // 每次更改模型时递增
    path: Realm.defaultPath,
  ));

  // 打开Realm实例
  final realm = await Realm.open();

  // 示例:插入数据
  realm.write(() {
    final user = User();
    user.id = '1';
    user.name = 'John Doe';
    user.age = 30;
    realm.add(user);
  });

  // 示例:读取数据
  List<User> users = realm.objects(User.self()).toList();
  print(users);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Realm Flutter Example'),
        ),
        body: Center(
          child: Text('Check the console for Realm data output!'),
        ),
      ),
    );
  }
}

5. 运行应用

运行你的Flutter应用,你应该会在控制台中看到插入的用户数据。

总结

以上是一个简单的Flutter项目中使用realm_generator插件生成Realm数据库相关代码的示例。通过使用注解和build_runner,你可以方便地创建和管理Realm模型,而无需手动编写大量的样板代码。

请确保你使用的是最新版本的realmrealm_generator插件,并根据项目的实际需求调整配置和模型定义。

回到顶部