Swift 3 |核心数据 |自定义实体

Swift 3 | CoreData | Custom Entities

我创建了一个带有实体的 CoreData 模型 "News" :

我将其设置为 "Manuel/None" 并创建了一个 NSManagedObject :

public class News: NSManagedObject {

    @NSManaged var id: String
    @NSManaged var newsType: Int16
    @NSManaged var newsImageUrl: String
    @NSManaged var newsVideoUrl: String
    @NSManaged var newsTitle: String
    @NSManaged var newsDesc: String

}

我想在不触及 CoreData 模型的情况下覆盖我的实体的属性,只需这样做:

extension News {
    @NSManaged var newsUrl: String
}

当然,如果我这样做:

news.newsUrl = ""

我得到了一个很好的

reason: '-[NSManagedObject setNewsUrl:]: unrecognized selector

如何在我的实体中添加正确的新属性(不修改 CoreData 模型),当然,我希望这个消息 属性 保存在 CoreData 中?

TY

您尝试的方法不起作用,因为仅声明新的 属性 是不够的,您必须使 属性 存在于数据模型中。如果您不编辑模型,则必须在代码中完成工作。

您可以在代码中修改整个模型直到您开始使用它。一旦加载持久存储文件,就必须将对象模型视为只读。基本步骤是

  1. NSManagedObjectModel 询问其 entitiesentitiesByName
  2. 在该列表中找到合适的 NSEntityDescription
  3. 为您的新 属性 创建一个新 NSAttributeDescription
  4. 将新属性添加到实体上的 properties 数组。

这不是一个好主意,我强烈建议不要这样做,但这并非不可能。在多年的核心数据编码中,我只在代码中修改过一次模型,以解决模型编译器中的一个(自修复)错误。

请记住,这不会让您避免进行模型迁移。您的持久存储文件必须与您使用的数据模型相匹配。在代码中修改模型会使管理模型版本变得更加困难,并且会增加应用程序因模型不匹配而崩溃的几率。