Flutter数据库生成插件realm_generator的使用
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
- 在cloud.mongodb.com上创建一个账户。
- 按照说明创建一个新的应用程序。
- 配置适当的认证提供程序类型。
- 启用Flexible Sync。
- 复制新应用程序的App ID。
2. 使用Device Sync
- 初始化App Services客户端并认证用户:
String appId = "<Atlas App ID>";
final appConfig = AppConfiguration(appId);
final app = App(appConfig);
final user = await app.logIn(Credentials.anonymous());
- 打开一个同步的Realm:
final config = Configuration.flexibleSync(user, [Task.schema]);
final realm = Realm(config);
- 添加同步订阅并写入数据:
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
更多关于Flutter数据库生成插件realm_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用realm_generator
插件来生成Realm数据库相关代码的示例。realm_generator
插件能够帮助你简化Realm数据库模型的创建过程,通过注解自动生成Realm所需的代码。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加realm
和realm_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模型,而无需手动编写大量的样板代码。
请确保你使用的是最新版本的realm
和realm_generator
插件,并根据项目的实际需求调整配置和模型定义。