Random Realm'已经打开了不同的架构模式'错误

时间:2018-01-04 10:42:23

标签: swift multithreading closures realm

在Swift应用程序中,我在didFinishLaunchingWithOptions中设置默认的Realm配置,如下所示:

Realm.Configuration.defaultConfiguration = {
    var config = Realm.Configuration.defaultConfiguration
    config.deleteRealmIfMigrationNeeded = true
    return config
}()

然后我在需要时以3种不同的方式创建新的Realm实例 - 阅读时:

let realm = try! Realm()
let users = realm.objects(User.self)

写作时:

let realm = try! Realm()
if let user = realm.object(ofType: User.self, forPrimaryKey: userId) {
    try! realm.write {
        user.name = name
    }
}

并在模特中:

import Foundation
import RealmSwift
import ObjectMapper

final class User: Object, StaticMappable {

    @objc dynamic var id = 0
    @objc dynamic var name = ""

    override static func primaryKey() -> String? {
        return "id"
    }

    func mapping(map: Map) {
        id <- map["id"]
        name <- map["name"]
    }

    static func objectForMapping(map: Map) -> BaseMappable? {
        let objectOptional = try? Realm().object(ofType: self, forMapping: map)
        if let object = objectOptional {
            return object
        }
        return nil
    }
}

问题是,有时我在完全关闭中创建新的Realm实例时遇到此错误,这些实例关闭使用频繁:

  

致命错误:'试试!'表达式意外地引发了错误:错误   Domain = io.realm Code = 1“路径上的领域   '/var/mobile/Containers/Data/Application/...../Documents/default.realm'   已经使用不同的架构模式打开了。“   UserInfo = {NSLocalizedDescription =路径中的域   '/var/mobile/Containers/Data/Application/...../Documents/default.realm'   已经使用不同的架构模式打开。,错误代码= 1

如何调试和解决此问题?

2 个答案:

答案 0 :(得分:1)

我必须确保在设置Realm之前设置Realm.Configuration.defaultConfiguration。在我的情况下,我是第一次做:让领域=尝试!在设置默认配置之前,在appDelegate中执行Realm()并执行一些数据导入任务。然后使用相同的机制从后台线程打开时失败。在调用let realm = try之前确保设置了默认配置! Realm()可以解决问题:现在可以在任何线程上打开。

答案 1 :(得分:0)

通过添加

解决了该问题
    Realm.Configuration.defaultConfiguration = {
            var config = Realm.Configuration.defaultConfiguration
            ...
            // Set the new schema version. This must be greater than the previously used
            // version (if you've never set a schema version before, the version is 0).
            config.schemaVersion = 0
    }

到app init上的Realm配置。