Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ / /

Realm 对象模型 - SwiftUI

在此页面上

  • 概念:对象模型和关系
  • 将对象模型绑定到用户界面
  • 为SwiftUI视图转换数据
  • 定义新对象
  • 定义投影

SwiftUI的数据建模建立在Swift SDK中相同的对象模型和关系概念之上。 如果您不熟悉Realm Swift SDK数据建模概念,请参阅:定义Realm 对象模型- Swift SDK。

Model-View-ViewModel (MVVM) 设计模式主张创建一个视图模型,从视图代码中抽象出模型。 虽然您当然可以使用Realm来做到这一点,但Swift SDK提供的工具可以让您轻松地直接在SwiftUI视图中处理数据。 这些工具包括:

  • 用于创建与底层可观察对象的绑定的属性包装器

  • 用于项目和转换根本的模型对象以在特定视图中使用的类

Realm Swift SDK提供了一种特殊类型的对象(称为投影),用于转换和处理数据子集。 考虑类似于视图模型的投影。 它允许您以不同的方式传递或转换原始对象的属性:

  • 直通:投影的属性与原始对象具有相同的名称和类型。

  • 重命名:投影的属性与原始对象具有相同的类型,但名称不同。

  • 键路径解析:使用此选项可访问权限投影对象的特定属性。

  • 集合映射:您可以将某些集合类型映射到原始值的集合。

  • 排除:投影模型中未定义的原始 Realm 对象的所有属性。 观察投影时,对这些属性的任何更改都不会trigger更改通知。

使用投影时,您可以获得 Realm 活动对象的所有好处:

  • 类投影对象实时更新

  • 您可以观察它的变化

  • 您可以将更改直接应用于写事务中的属性

你可以通过从 ObjectEmbeddedObject 类派生来定义 Realm 对象。类的名称成为域中的表名称,并且类的属性将在在数据库中持久保留。这样一来,处理持久对象就像处理常规 Swift 对象一样容易。

Realm SwiftUI 文档使用一个虚构应用程序 DoggoDB 的模型。 此应用是养狗员工的公司名录。 它允许人们与其他员工分享有关他们的狗的一些详细信息。

该数据模型包括一个 Person对象,与该人的 Dog 对象具有一对多关系。 它还使用特殊的Realm Swift SDK数据类型PersistableEnum来存储有关此人的业务部门的信息。

class Person: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var firstName = ""
@Persisted var lastName = ""
@Persisted var personId = ""
@Persisted var company = "MongoDB"
@Persisted var businessUnit = BusinessUnitEnum.engineering
@Persisted var profileImageUrl: URL?
@Persisted var dogs: List<Dog>
}
enum BusinessUnitEnum: String, PersistableEnum, CaseIterable {
case customerEngineering = "Customer Engineering"
case educationCommunityAndDocs = "Education, Community and Docs"
case engineering = "Engineering"
case financeAndOperations = "Finance and Operations"
case humanResourcesAndRescruiting = "Human Resources and Recruiting"
case management = "Management"
case marketing = "Marketing"
case product = "Product"
case sales = "Sales"
}
class Dog: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var _id: UUID
@Persisted var name = ""
@Persisted var breed = ""
@Persisted var weight = 0
@Persisted var favoriteToy = ""
@Persisted var profileImageUrl: URL?
@Persisted var dateLastUpdated = Date()
@Persisted(originProperty: "dogs") var person: LinkingObjects<Person>
var firstLetter: String {
guard let char = name.first else {
return ""
}
return String(char)
}
}

提示

另请参阅:

有关定义 Realm 对象模型的完整详细信息,请参阅:

我们虚构的 DoggoDB应用有一个用户配置文件视图。 此视图显示有关人员的一些详细信息,但我们不需要 Person模型的所有属性。 我们可以创建一个仅包含所需细节的投影。 我们还可以修改lastName属性,以仅使用姓氏的第一个首字母。

class Profile: Projection<Person> {
@Projected(\Person.firstName) var firstName // Passthrough from original object
@Projected(\Person.lastName.localizedCapitalized.first) var lastNameInitial // Access and transform the original property
@Projected(\Person.personId) var personId
@Projected(\Person.businessUnit) var businessUnit
@Projected(\Person.profileImageUrl) var profileImageUrl
@Projected(\Person.dogs) var dogs
}

我们可以在“配置文件”视图中使用此投影来代替原始的Person对象。

类投影可与 SwiftUI 属性包装器配合使用:

后退

模型数据