领域默认同步文件

Realm default sync file

学习如何使用 Realm 移动平台。

我构建了一个小型 iOS 应用程序,它成功地将数据保存到服务器,并且数据在不同设备上是一致的。该应用程序与 official realm tutorial 非常相似。

我可以从 Realm 浏览器 Mac 应用程序 打开 Sync URL,我可以看到实时发生的变化。这就是我卡住的地方:我试图查看本地领域文件中的更改,但是

print(self.realm.configuration.fileURL) returns 无 print(Realm.Configuration.defaultConfiguration.fileURL) 是一个空文件

这是我的代码:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
    guard let user = user else {
        fatalError(String(describing: error))
    }

    DispatchQueue.main.async {
        // Open Realm
        let configuration = Realm.Configuration(
            syncConfiguration: SyncConfiguration(
                user: user,
                realmURL: URL(string: "realm://myIPaddress/~/realmtasks")!)
            )

        self.realm = try! Realm(configuration: configuration)

        // Show initial tasks
        func updateList() {
            self.items = Array(self.realm.objects(Row.self))
            self.tableView.reloadData()
        }

        updateList()

        print(self.realm.configuration.fileURL) 
        //returns nil

        print(Realm.Configuration.defaultConfiguration.fileURL) 
        // I can open the file, but it's empty

        // Notify us when Realm changes
        self.notificationToken = self.realm.addNotificationBlock { _ in
            updateList()
        }
}

我测试这个的原因是我可以从文件而不是从服务器加载数据。这样:(a)登录只会被调用一次(b)当用户离线时数据可用。

当您第一次登录时,Realm 会自动将用户存储在钥匙串中。然后您可以通过 SyncUser.currentUser 属性 检索它并使用它打开您的领域,即使您处于离线状态。但是,如果您注销用户,那么您将无法离线使用它。

realm.configuration.fileURL 在使用 syncConfiguration 时不可用。


对于这种情况:

  1. 只调用SyncUser.logIn一次
  2. 对于普通应用程序 运行s (即除初始 运行 之外的所有 运行s),open 使用相同的领域配置。

你应该有这样的东西:

// First launch
if launchedBefore == false {
    setupRealm()

// All other launches
} else if launchedBefore == true {
    let user = SyncUser.current!
    openRealm(forUser: user)
}

openRealm(forUser: SyncUser) 与前面代码中的整个分派块基本相同。

setupRealm()也可以调用它来清理代码:

SyncUser.logIn(with: cloudKitCredentials, server: serverURL) { user, error in
    guard let user = user else {
        fatalError(String(describing: error))
    }

    self.openRealm(forUser: user)
}