【问题标题】:realm migration, cannot add property领域迁移,无法添加属性
【发布时间】:2018-10-11 14:40:19
【问题描述】:

测试领域,无法向我的测试类添加新属性。遵循文档和一些答案,但两者都不起作用。在我的代码中,即使使用更新的领域,用于迁移的“普通”空默认块也不起作用。

收到此错误

线程 1:致命错误:“尝试!”表达式意外引发错误:Error Domain=io.realm Code=10 “由于以下错误,需要迁移: - 属性 'ComicType.creationDate' 已添加。” UserInfo={NSLocalizedDescription=由于以下错误需要迁移: - 已添加属性“ComicType.creationDate”。错误代码=10}

似乎我没有更改 schemaVersion,但我在“基本”迁移块中更改了。我检查应用程序委托中的架构版本:

 let configCheck = Realm.Configuration();
        do {
            let fileUrlIs = try schemaVersionAtURL(configCheck.fileURL!)
            print("schema version \(fileUrlIs)")
        } catch  {
            print(error)
        }

我的 AppDelegate:

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.


        let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { migration, oldSchemaVersion in

                if (oldSchemaVersion < 1) {
                }

        })

        Realm.Configuration.defaultConfiguration = config

        _ = try! Realm()



        return true
    }

我的班级:

import Foundation
import RealmSwift

class ComicType: Object {
    @objc dynamic var name : String = ""
    @objc dynamic var creationDate : Date? //the new property

}

【问题讨论】:

  • 请指定“不工作”。您不需要在迁移块中执行任何操作,Realm 可以处理这样的简单迁移(添加具有默认值的新属性),因此如果空迁移块不起作用,则必须进行其他操作。
  • 添加了错误信息
  • 您确定您的schemaVersion 只需为1 吗?这是您的第一次迁移吗?
  • 是的,它是一个测试应用程序,一切正常编辑对象,但测试迁移脚本我无法摆脱这个错误。
  • 作为测试,我将您的代码复制并粘贴到一个项目中,并使用 ComicType 原始 creationDate 属性。在代码中,我添加了一些对象。然后我注释掉旧的 CreationDate 并取消注释新的,将 schemaVersion 更改为 2 并运行代码。它工作得很好。然后我对 ComicType 对象进行了一些更改(添加和删除属性等),每次都更新迁移编号并且它工作正常。此外,通过更改可选的 var Date,您期望什么? = nil 到另一个可选变量 creationDate : Date?。该更改不需要迁移。

标签: swift realm realm-migration


【解决方案1】:

问题以这种方式解决:真正的问题不是架构编号,而是根本不调用迁移代码,我意识到迁移架构始终保持不变。真正的错误是在我的视图控制器中调用let realm = try! Realm(),并将其用作全局常量。现在使用 lazy var realm = try! Realm() 找到了很大的帮助 here 。现在,在我的模型每次更改后,我都会在 appDelegate 中更新 schemaVersion。

【讨论】:

  • 没有调用迁移代码,因为根据我对您问题的评论,没有什么可迁移的。可选项是可选项,因此告诉 nil 可选项为 nil 并没有做任何事情,因此没有什么可迁移的。换句话说,变量的类型没有被更改为任何不同的类型,因此不会调用迁移代码。
  • 我认为我们误解了彼此,因此也误解了这个问题。原始模型只有名称。片刻之后,我尝试添加日期。它们都是使迁移块工作的测试。
【解决方案2】:

有效的方法是从 iOS 模拟器中删除应用程序,然后使用 XCode 再次运行它。更多相关信息可在此处找到:https://github.com/RocketChat/Rocket.Chat.iOS/issues/104

我遇到了类似的问题,我的错误堆栈跟踪是这样开始的:

`fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors:

显示的错误只是确认某些对象已保存在本地。所以,不知道是什么导致了问题。

我的想法是,问题是违反了领域数据库的架构,因为我更新了我一直在本地保存的对象类。因此,它要求我更新架构。

我想当应用程序被删除并再次运行时,会创建一个新的 Realm 文件。如果是这样,则创建一个适用于最新代码的新模式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多