Realm 对象模型 - SwiftUI
概念:对象模型和关系
SwiftUI的数据建模建立在Swift SDK中相同的对象模型和关系概念之上。 如果您不熟悉Realm Swift SDK数据建模概念,请参阅:定义Realm 对象模型- Swift SDK。
将对象模型绑定到用户界面
Model-View-ViewModel (MVVM) 设计模式主张创建一个视图模型,从视图代码中抽象出模型。 虽然您当然可以使用Realm来做到这一点,但Swift SDK提供的工具可以让您轻松地直接在SwiftUI视图中处理数据。 这些工具包括:
用于创建与底层可观察对象的绑定的属性包装器
用于项目和转换根本的模型对象以在特定视图中使用的类
为SwiftUI视图转换数据
Realm Swift SDK提供了一种特殊类型的对象(称为投影),用于转换和处理数据子集。 考虑类似于视图模型的投影。 它允许您以不同的方式传递或转换原始对象的属性:
直通:投影的属性与原始对象具有相同的名称和类型。
重命名:投影的属性与原始对象具有相同的类型,但名称不同。
键路径解析:使用此选项可访问权限投影对象的特定属性。
集合映射:您可以将某些集合类型映射到原始值的集合。
排除:投影模型中未定义的原始 Realm 对象的所有属性。 观察投影时,对这些属性的任何更改都不会trigger更改通知。
使用投影时,您可以获得 Realm 活动对象的所有好处:
类投影对象实时更新
您可以观察它的变化
您可以将更改直接应用于写事务中的属性
定义新对象
你可以通过从 Object 或 EmbeddedObject 类派生来定义 Realm 对象。类的名称成为域中的表名称,并且类的属性将在在数据库中持久保留。这样一来,处理持久对象就像处理常规 Swift 对象一样容易。
Realm SwiftUI 文档使用一个虚构应用程序 DoggoDB 的模型。 此应用是养狗员工的公司名录。 它允许人们与其他员工分享有关他们的狗的一些详细信息。
该数据模型包括一个 Person对象,与该人的 Dog 对象具有一对多关系。 它还使用特殊的Realm Swift SDK数据类型PersistableEnum来存储有关此人的业务部门的信息。
class Person: Object, ObjectKeyIdentifiable { true) var _id: ObjectId (primaryKey: var firstName = "" var lastName = "" var personId = "" var company = "MongoDB" var businessUnit = BusinessUnitEnum.engineering var profileImageUrl: URL? 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 { true) var _id: UUID (primaryKey: var name = "" var breed = "" var weight = 0 var favoriteToy = "" var profileImageUrl: URL? var dateLastUpdated = Date() "dogs") var person: LinkingObjects<Person> (originProperty: var firstLetter: String { guard let char = name.first else { return "" } return String(char) } }
定义投影
我们虚构的 DoggoDB应用有一个用户配置文件视图。 此视图显示有关人员的一些详细信息,但我们不需要 Person
模型的所有属性。 我们可以创建一个仅包含所需细节的投影。 我们还可以修改lastName
属性,以仅使用姓氏的第一个首字母。
class Profile: Projection<Person> { Person.firstName) var firstName // Passthrough from original object (\ Person.lastName.localizedCapitalized.first) var lastNameInitial // Access and transform the original property (\ Person.personId) var personId (\ Person.businessUnit) var businessUnit (\ Person.profileImageUrl) var profileImageUrl (\ Person.dogs) var dogs (\}
我们可以在“配置文件”视图中使用此投影来代替原始的Person
对象。
类投影可与 SwiftUI 属性包装器配合使用: