2016-12-16 88 views
0

我创建了一个CoreData模型实体“新闻报”:Swift 3 | CoreData |自定义实体

enter image description here

我将它设置为“曼努埃尔/无”,并创建了一个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 Model),当然,我希望将这个新闻属性保存在CoreData中?

TY

+0

您必须将属性添加到模型中的实体。 – shallowThought

+0

因此,现在有办法在不修改CoreData Model的情况下在NSManagedObject中添加属性?即使扩展?这似乎很奇怪! – Aximem

+0

如果在模型中没有定义该列,该列不能存在于数据库中。 – shallowThought

回答

1

你试过没有工作,因为它是不够的,只是声明新的属性的方法,你不得不做出这样的特性存在于数据模型。如果您不编辑模型,则必须在代码中完成这项工作。

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

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

这不是一个好主意,我强烈建议不要这样做,但这并非不可能。在多年的Core Data编码中,我只修改了一次代码中的模型,以解决模型编译器中的(因为固定的)错误。

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

+0

谢谢你的回答汤姆,这很清楚 – Aximem