斯威夫特3 | CoreData |自定义实体

时间:2016-12-16 11:02:26

标签: swift core-data swift3 nsmanagedobject

我创建了一个带有实体“新闻”的CoreData模型:

enter image description here

我将它设置为“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 = ""

我得到了一个很好的

  

原因:' - [NSManagedObject setNewsUrl:]:无法识别的选择器

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

TY

1 个答案:

答案 0 :(得分:1)

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

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

  1. NSManagedObjectModel询问entitiesentitiesByName
  2. 在该列表中找到相应的NSEntityDescription
  3. 为您的新媒体资源创建新的NSAttributeDescription
  4. 将新属性添加到实体上的properties数组。
  5. 这不是一个好主意,我强烈建议不要这样做,但这并非不可能。在核心数据编码的多年中,我只在代码中修改了一次模型,以解决模型编译器中的(自固定的)错误。

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