领域迁移问题。如何更新应包含在其中的数据

时间:2018-07-30 23:15:44

标签: ios swift migration realm realm-migration

我从领域文档复制并粘贴代码。但是不知道如何更改我在旁边评论的那部分来表示。 (在底部) 以下是我收到的完整错误消息:

  

初始化新领域时出错,错误域= io.realm代码= 10“由于以下错误,需要迁移:   -已添加属性'Item.dateCreated'。“ UserInfo = {NSLocalizedDescription = Migration是必需的,由于以下错误:   -已添加属性“ Item.dateCreated”。,错误代码= 10}   2018-07-30 21:25:24.231575-0400 Todoey [87561:3063712] ***由于未捕获的异常'RLMException'终止了应用程序,原因:类'Category'的属性名称'dateCreated'无效。'

以下是我尝试迁移的女巫中的代码:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    print(Realm.Configuration.defaultConfiguration.fileURL)

    do {
        let realm = try Realm()
    } catch {
        print("error initializing newrealm, \(error)")
    }

    //Migration
    let config = Realm.Configuration(

        schemaVersion: 1,

        migrationBlock: { migration, oldSchemaVersion in

            if (oldSchemaVersion < 1) {

                migration.enumerateObjects(ofType: Category.className()) { (old, new) in
                    new!["dateCreated"] = Date()
                }
                migration.enumerateObjects(ofType: Item.className()) { (old, new) in
                    new!["dateCreated"] = Date()
                }
            }
    })

    Realm.Configuration.defaultConfiguration = config
    //Migration X

    return true
}

问题似乎出在“ //将名称字段组合成一个字段”注释所在的位置。我需要将这些值更改为以下内容:

class Item: Object {
    @objc dynamic var title: String = ""
    @objc dynamic var done: Bool = false
    @objc dynamic var dateCreated = NSDate() //this is the new data
    var parentCategory = LinkingObjects(fromType: Category.self, property: "items")
}

2 个答案:

答案 0 :(得分:1)

问题是已添加到领域数据库中的新属性。

当您在模拟器中运行您的应用程序时,它将拉起没有此新属性的旧领域数据库。

在Xcode 10,Swift 4.2中运行的解决方案:

  • 运行模拟器
  • 按住您的应用程序图标,当它抖动时,只需将其从模拟器中删除即可。
  • 通过Xcode再次构建并运行应用程序,模拟器将添加新的属性来拉动新的领域数据库。

注意:这将从旧的领域数据库中删除所有数据并重新开始。

希望这会有所帮助。

答案 1 :(得分:0)

在您的情况下-由于您仅添加了一个新属性-您需要做的就是将模式版本增加到2,而Realm将负责其余的工作。