我最近创建了一个新分支,并尝试重构我的大部分代码,以便Realm
对CoreData
进行重击。但到目前为止,我没有运气让我的代码运行。
首先,在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");
}*/
无济于事。感到非常失落,所以任何方向都值得赞赏。
答案 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);
}