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

更改对象模型 - SwiftUI

在此页面上

  • Overview
  • 将迁移的数据与 SwiftUI 结合使用
  • 设置默认配置
  • 将配置对象作为环境对象传递
  • 将更新的配置显式传递给Realm SwiftUI属性包装器

注意

修改同步 Realm 的模式属性

以下页面演示了如何修改本地域的模式属性。 了解如何修改同步域的模式属性。

更新对象模式时,必须递增模式版本并执行迁移。 您可以在应用程序的主要版本之间更新对象模式。

有关如何实际执行迁移的信息,请参阅:更改对象模型。

本页重点介绍如何在 SwiftUI 视图中使用迁移的数据。

要执行迁移,请执行以下操作:

  • 更新模式并根据需要写入迁移区块

  • 在初始化Realm时,指定使用此迁移逻辑和/或更新模式版本的域配置。

在这里,您有几个选项来传递配置对象。 您可以:

  • 将配置设置为默认配置。 如果没有通过环境注入或作为参数显式传递配置,属性包装器将使用默认配置。

  • 使用环境注入将此配置提供给层次结构中使用Realm的第一个视图

  • 向采用配置对象(例如 @ObservedResults@AsyncOpen的 Realm 属性包装器显式提供配置。

例子

示例,您可能想要向现有对象添加属性。 我们可以向 DoggoDB 中的Dog对象添加一个favoriteTreat属性:

@Persisted var favoriteTreat = ""

将新属性添加到模式后,必须递增模式版本。 您的Realm.Configuration可能如下所示:

let config = Realm.Configuration(schemaVersion: 2)

在层次结构中第一个需要此配置的视图可以访问的位置声明此配置。 在@main应用入口点上方进行声明可使其在任何地方可用,但您也可以将其放在首次打开域的文件中。

您可以在SwiftUI应用中设立默认配置,就像设置任何其他Realm Swift应用一样。 通过将新的Realm.Configuration实例分配给 Realm .Configuration.defaultConfiguration 来设置默认域Realm 类属性。

// Open the default realm
let defaultRealm = try! Realm()
// Open the realm with a specific file URL, for example a username
let username = "GordonCole"
var config = Realm.Configuration.defaultConfiguration
config.fileURL!.deleteLastPathComponent()
config.fileURL!.appendPathComponent(username)
config.fileURL!.appendPathExtension("realm")
let realm = try! Realm(configuration: config)

声明配置后,您可以将其作为环境对象注入到层次结构中第一个打开域的视图中。 如果您使用@ObservedResults@ObservedRealmObject属性包装器,这些视图会隐式打开一个域,因此它们也需要访问权限此配置。

.environment(\.realmConfiguration, config)

如果您的应用使用本地 Realm 或同步域,则层次结构中打开域的第一个视图会有所不同,具体取决于您使用的应用是否启用了 Sync。

如果没有同步,您可以将 Realm 配置环境对象直接传递给LocalOnlyContentView

.environment(\.realmConfiguration, config)

它使用以下内容隐式打开一个域 :

struct LocalOnlyContentView: View {
// Implicitly use the default realm's objects(Dog.self)
@ObservedResults(Dog.self) var dogs
var body: some View {
if dogs.first != nil {
// If dogs exist, go to the DogsView
DogsView()
} else {
// If there is no Dog object, add one here.
AddDogView()
}
}
}

但是,当您的应用使用同步时,您的Realm会显式使用@AsyncOpen@AutoOpen属性包装器:

/// This view opens a synced realm.
struct OpenFlexibleSyncRealmView: View {
// We've injected a `flexibleSyncConfiguration` as an environment value,
// so `@AsyncOpen` here opens a realm using that configuration.
@AsyncOpen(appId: flexibleSyncAppId, timeout: 4000) var asyncOpen
var body: some View {
switch asyncOpen {
// Starting the Realm.asyncOpen process.
// Show a progress view.
case .connecting:
ProgressView()
// Waiting for a user to be logged in before executing
// Realm.asyncOpen.
case .waitingForUser:
ProgressView("Waiting for user to log in...")
// The realm has been opened and is ready for use.
// Show the content view.
case .open(let realm):
// Do something with the realm
UseRealmView(realm: realm)
// The realm is currently being downloaded from the server.
// Show a progress view.
case .progress(let progress):
ProgressView(progress)
// Opening the Realm failed.
// Show an error view.
case .error(let error):
ErrorView(error: error)
}
}
}

因此,您必须将环境对象传递给显式打开 Realm 的视图。 在本例中, OpenFlexibleSyncRealmView

要记住的重要一点是,确保将包含迁移逻辑的Realm.Configuration传递给任何隐式或显式打开域的视图层次结构。

您可以将配置对象显式传递给接受配置对象(例如@ObservedResults@AutoOpen的 Realm SwiftUI 属性包装器。 在这种情况下,您可以将其直接传递给@ObservedResults中的DogsView

// Use a `config` that you've passed in from above.
@ObservedResults(Dog.self, configuration: config) var dogs

后退

Realm 对象模型