首页 > 解决方案 > Swift 中的轻量级核心数据迁移问题

问题描述

我已经实现了核心数据迁移,因为我需要向我的 CoreData 模型添加一个新属性。

我所做的基本上是:

  1. 创建新的模型版本。
  2. 编辑新模型版本。
  3. 在创建 persistentStoreCoordinator 时将选项 NSMigratePersistentStoresAutomaticallyOption 和 NSInferMappingModelAutomaticallyOption 设置为 YES。
  4. 将当前版本设置为新版本。

然后我将属性添加到NSManagedObject类:

extension Clip {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Clip> {
        return NSFetchRequest<Clip>(entityName: "Clip")
    }

    @NSManaged public var text: String?
    @NSManaged public var date: String?
    @NSManaged public var hidden: NSNumber?
    @NSManaged public var desc: String?
    @NSManaged public var pinned: NSNumber?

    @NSManaged public var tag: String?  //new
}

我将新项目保存到核心数据中,如下所示:


    var filteredClips = [Clip]()

    func appendNewItem(text: String, desc: String?){
        let entityDescription = NSEntityDescription.entity(forEntityName: "Clip", in: managedContext)!
        let newItem = Clip.init(entity: entityDescription, insertInto: managedContext)
        newItem.text = text.trimmingCharacters(in: .whitespacesAndNewlines)
        newItem.date = getDate()
        newItem.desc = desc
        newItem.tag = "favourite" //new attribute
        newItem.hidden = false
        filteredClips.append(newItem)
        
        try! managedContext.save()
    }

无法将项目添加到 coredata 数组。我在启动时收到此错误消息:

"Failed to call designated initializer on NSManagedObject class 'Clip'"

更新

我认为该错误消息与此问题无关,因为即使撤消迁移步骤也会出现此问题。

标签: swiftcore-datacore-data-migration

解决方案


似乎问题源于,xcdatamodel主应用程序的目标成员资格被禁用。一旦我添加了目标成员,它就会按预期工作。


推荐阅读