关系 - Flutter SDK
您可以从自己的 Realm 模型引用其他 Realm 模型。这样可以在 Realm 对象之间创建以下类型的关系:
您还可以将一个 Realm 对象直接嵌入另一个 Realm 对象,创建嵌套数据结构。嵌入式对象与关系类似,但提供了额外的约束条件。有关这些限制以及如何创建嵌入式对象的更多信息,请参阅嵌入式对象数据类型文档。
对一关系
对一关系是指一个对象以特定方式与不超过一个其他对象相关。
要设置对一关系,请在您的模型中创建一个类型为另一个模型的属性。多个对象可以引用同一个对象。
重要
对一关系必须是可选的
在对象模型中声明对一关系时,它必须是一个可选属性。如果您尝试建立所需的对一关系,Realm 会在运行时引发异常。
()class _Bike { () late ObjectId id; late String name; late _Person? owner; } ()class _Person { () late ObjectId id; late String firstName; late String lastName; late int? age; }
对多关系
对多关系是指一个对象以特定方式与多个对象相关。
您可以在应用程序中使用类型为 List<T>
的属性创建一个对象与任意数量的对象之间的关系,其中 T 是 Realm 模型类。
()class _Scooter { () late ObjectId id; late String name; late _Person? owner; } ()class _ScooterShop { () late ObjectId id; late String name; late List<_Scooter> scooters; }
反向关系
反向关系将 Realm 对象链接回以对一或对多关系引用该对象的任何其他 Realm 对象。
反向关系具有以下属性:
您必须在对象模型中明确将属性定义为反向关系。模式无法推断反向关系。
逆向关系会自动使用相应的反向链接进行更新。您可以通过手动查询查找同一组 Realm 对象,但使用逆向关系字段可以减少样板查询代码和出错的可能性。
无法手动设置反向关系属性的值。相反,每当您添加或删除相关对象时,Realm 会更新隐式关系。
反向链接仅适用于 Realm 对象。 尚未添加到 Realm 中的对象没有反向链接。
例如,对多关系“a User has many Tasks”不会自动创建反向关系“a Task belongs to one User”。如果不在对象模型中指定反向关系,就需要运行单独的查询来查找分配给某个任务的用户。
使用 反向链接 属性注解来定义反向关系。传递 符号 您要为其创建反向链接作为Backlink()
的参数的一对一或一对多字段的字段名。在注解下方的字段中包含要反向链接到的对象模型的Iterable
。
()class _User { () late ObjectId id; late String username; // One-to-many relationship that the backlink is created for below. late List<_Task> tasks; } ()class _Task { () late ObjectId id; late String description; late bool isComplete; // Backlink field. Links back to the `tasks` property in the `_User` model. (#tasks) late Iterable<_User> linkedUser; }
注意
Device Sync 中不存在反向关系
如果您使用的是 Atlas Device Sync,则 App Services App 的服务器端 Device Sync 模式中不存在反向关系。由于您无法直接设置反向关系的值,因此 Device Sync 模式中不存在该关系。
有关服务器端 Device Sync 模式的详细信息,请参阅 Atlas App Services 文档中的配置和更新数据模型。