RealmSwift:已经使用不同架构版本打开的路径中的域

时间:2016-02-03 23:40:08

标签: ios xcode swift realm

我最近创建了一个新分支,并尝试重构我的大部分代码,以便RealmCoreData进行重击。但到目前为止,我没有运气让我的代码运行。

首先,在shared_realm.cpp中抛出异常。抛出错误的代码行是:

if (realm->config().schema_version != config.schema_version && config.schema_version != ObjectStore::NotVersioned) {
   throw MismatchedConfigException("Realm at path already opened with different schema version.");
}

如果我跳过此异常,它将捕获以下代码中的第二行代码:

class func getAllCategories() -> Results<Category> {
    let realm = try! Realm()
    let categories = realm.objects(Category)

    return categories
}

并抛出此错误消息:

  

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

我对Realm完全陌生,所以对任何帮助表示赞赏。我从文档中了解到Realm()是访问默认数据库的正确方法,这对我目前来说很好。起初我认为也许一个王国必须传遍,但我从网上的例子中看到,情况似乎并非如此。

我已经清理过,更改了模拟器,甚至更新了Xcode。我还试图将这行代码注释回来:

// FIXME - enable schema comparison
/*if (realm->config().schema != config.schema) {
  throw MismatchedConfigException("Realm at path already opened with different schema");
}*/

无济于事。感到非常失落,所以任何方向都值得赞赏。

3 个答案:

答案 0 :(得分:1)

路径的架构版本在打开后无法更改,因此您需要在使用setSchemaVersion调用路径之前更改架构。

setSchemaVersion(1, realmPath: Realm.defaultPath) { (migration, oldSchemaVersion) -> Void in
    if oldSchemaVersion < 1 {
        migration.enumerate(Category.className(), { (oldObject, newObject) -> Void in
            let constant = oldObject!["constant"] as! String
            newObject!["constant"] = constant
        })
    }
}

答案 1 :(得分:1)

您可能遇到此问题,因为您在构建应用程序一次后更改了架构(只是猜测,您可以通过删除应用程序并重建它来确认这一点,这也会清除现有的域数据库。)< / p>

如果这确实是问题,你应该研究一下 https://realm.io/docs/swift/latest/#migrations 其中概述了解决此问题的推荐方法。

答案 2 :(得分:0)

对我来说,问题是我添加了一个新字段作为字符串,如下所示:

        schema.get("RealmCompany").addField("ctype", String.class);

当我在模型类中将其声明为整数时。

我必须这样做:

        if (oldVersion == 7) {
            Log.i(TAG, "migrate: " + 7);
            schema.get("RealmCompany").removeField("ctype");
            schema.get("RealmCompany").addField("ctype", Integer.class);

        }