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
您尝试的方法不起作用,因为仅声明新的 属性 是不够的,您必须使 属性 存在于数据模型中。如果您不编辑模型,则必须在代码中完成工作。
您可以在代码中修改整个模型直到您开始使用它。一旦加载持久存储文件,就必须将对象模型视为只读。基本步骤是
- 向
NSManagedObjectModel
询问其 entities
或 entitiesByName
。
- 在该列表中找到合适的
NSEntityDescription
。
- 为您的新 属性 创建一个新
NSAttributeDescription
。
- 将新属性添加到实体上的
properties
数组。
这不是一个好主意,我强烈建议不要这样做,但这并非不可能。在多年的核心数据编码中,我只在代码中修改过一次模型,以解决模型编译器中的一个(自修复)错误。
请记住,这不会让您避免进行模型迁移。您的持久存储文件必须与您使用的数据模型相匹配。在代码中修改模型会使管理模型版本变得更加困难,并且会增加应用程序因模型不匹配而崩溃的几率。
我创建了一个带有实体的 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
您尝试的方法不起作用,因为仅声明新的 属性 是不够的,您必须使 属性 存在于数据模型中。如果您不编辑模型,则必须在代码中完成工作。
您可以在代码中修改整个模型直到您开始使用它。一旦加载持久存储文件,就必须将对象模型视为只读。基本步骤是
- 向
NSManagedObjectModel
询问其entities
或entitiesByName
。 - 在该列表中找到合适的
NSEntityDescription
。 - 为您的新 属性 创建一个新
NSAttributeDescription
。 - 将新属性添加到实体上的
properties
数组。
这不是一个好主意,我强烈建议不要这样做,但这并非不可能。在多年的核心数据编码中,我只在代码中修改过一次模型,以解决模型编译器中的一个(自修复)错误。
请记住,这不会让您避免进行模型迁移。您的持久存储文件必须与您使用的数据模型相匹配。在代码中修改模型会使管理模型版本变得更加困难,并且会增加应用程序因模型不匹配而崩溃的几率。