在应用程序生命周期的中间阶段(在Swift中)将本地领域转换为同步的领域

时间:2019-06-04 06:17:36

标签: ios swift realm realm-cloud

我的应用将具有一项称为“多设备同步”的付费功能。我想通过Realm Cloud-基于查询的同步来实现该功能。

我知道如何将本地Realm转换为同步Realm this thread

但这是基于以下场景:用户从应用程序启动开始同步其领域-在打开其未同步的本地领域之前。这对我不起作用,因为我的用户在付款后便会开始同步。

因此,我必须在应用程序生命周期的中间阶段转换其本地领域,并且到那时该本地领域已经打开。

我的问题出现在这里。当我尝试将本地领域转换为同步领域时,应用程序崩溃,并显示以下消息:

  

路径“ ...”中的领域已打开,并且具有不同的读取权限。

我试图找到一种在转换之前关闭本地Realm的方法,但是Realm可可不允许我以编程方式关闭Realm。

这是我将本地Realm转换为同步Realm的代码。

func copyLocalRealmToSyncedRealm(user: RLMSyncUser) {

    let localConfig = RLMRealmConfiguration()
    localConfig.fileURL = Realm.Configuration.defaultConfiguration.fileURL
    localConfig.dynamic = true
    localConfig.readOnly = true

    // crashes here
    let localRealm = try! RLMRealm(configuration: localConfig)

    let syncConfig = RLMRealmConfiguration()
    syncConfig.syncConfiguration = RLMSyncConfiguration(user: user,
                                                        realmURL: realmURL,
                                                        isPartial: true,
                                                        urlPrefix: nil,
                                                        stopPolicy: .liveIndefinitely,
                                                        enableSSLValidation: true,
                                                        certificatePath: nil)
    syncConfig.customSchema = localRealm.schema

    let syncRealm = try! RLMRealm(configuration: syncConfig)
    syncRealm.schema = syncConfig.customSchema!
    try! syncRealm.transaction {
        let objectSchema = syncConfig.customSchema!.objectSchema
        for schema in objectSchema {
            let allObjects = localRealm.allObjects(schema.className)
            for i in 0..<allObjects.count {
                let object = allObjects[i]
                RLMCreateObjectInRealmWithValue(syncRealm, schema.className, object, true)
            }
        }
    }
}

任何帮助将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:0)

我制作了本地领域文件的副本,并使用RLMRealmConfiguration打开了该副本。之后,只需删除两个文件。这不是最好的解决方案,但它可行