【问题标题】:Random Realm 'already opened with a different schema mode' errors随机领域“已经以不同的模式模式打开”错误
【发布时间】:2018-06-14 01:55:45
【问题描述】:

在 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

如何调试和解决这个问题?

【问题讨论】:

    标签: swift multithreading closures realm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      问题已通过添加解决了

          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
          }
      

      到应用初始化时的领域配置。

      【讨论】:

      • 对我不起作用。从后台线程(NSOperationQueue 的 main() 方法)打开领域时同样的问题。从前台线程工作正常。我在做:让领域=尝试! Realm() 无处不在。从前台工作,但不能从后台工作。
      猜你喜欢
      • 2018-07-14
      • 2016-05-13
      • 2012-05-03
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多