【问题标题】:Realm migration issue. How do I Update the data that should be in it领域迁移问题。如何更新应该在其中的数据
【发布时间】:2018-07-30 23:15:43
【问题描述】:

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

error initializing newrealm, Error Domain=io.realm Code=10 "由于以下错误需要迁移: - 属性 'Item.dateCreated' 已添加。" UserInfo={NSLocalizedDescription=由于以下错误需要迁移: - 已添加属性“Item.dateCreated”。错误代码=10} 2018-07-30 21:25:24.231575-0400 Todoey[87561:3063712] *** 由于未捕获的异常“RLMException”而终止应用程序,原因:“类别”的属性名称“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")
}

【问题讨论】:

标签: ios swift migration realm realm-migration


【解决方案1】:

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

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

适用于 Xcode 10、Swift 4.2 的解决方案:

  • 运行模拟器
  • 按住您的应用图标,当它抖动时,只需将其从模拟器中删除即可。
  • 再次从 Xcode 构建并运行应用程序,模拟器将提取新的领域数据库并添加新属性。这将从旧领域数据库中删除您的所有数据并重新开始。

注意:当应用程序仍在开发中并使用模拟器时,此解决方案很好。如果您的应用程序已经发布并投入生产,那么您应该增加数据库的架构版本。在 Realm 网站上有如何做到这一点的指南。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在您的情况下 - 因为您只是添加了一个新属性 - 您需要做的就是将架构版本增加到 2,而 Realm 将负责其余的工作。

    【讨论】:

    • 这听起来可能很愚蠢,但是为了增加我应该在它们引用架构版本的任何地方将 1 更改为 2?
    • 迁移只能在一个地方完成。您已经将他们提供的示例复制到了那里。你只需要其中之一。只需在当前显示 schemaVersion 的 schemaVersion 参数中提供它: 1. 每次对 Realm 对象进行更改时,都需要增加该值。他们提供的带有名字和姓氏的示例向您展示了如何处理对现有属性的更改并将现有数据迁移到新架构。
    • 我更新了代码,如上所示,我确实将它从 1 递增。但现在我得到以下信息:初始化 newrealm 时出错,错误域 = io.realm 代码 = 10“由于以下错误需要迁移:- 属性 'Item.dateCreated' 已添加。” UserInfo={NSLocalizedDescription=由于以下错误而需要迁移:-已添加属性“Item.dateCreated”。,错误代码=10} 2018-07-30 21:25:24.231575-0400 Todoey[87561:3063712] * ** 由于未捕获的异常“RLMException”而终止应用程序,原因:“类“Category”的属性名称“dateCreated”无效。”
    • 您还需要在初始化 Realm 之前设置配置。在“let realm = try Realm()”之前做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多