斯威夫特 3 |核心数据 |自定义实体
Posted
技术标签:
【中文标题】斯威夫特 3 |核心数据 |自定义实体【英文标题】:Swift 3 | CoreData | Custom Entities 【发布时间】:2016-12-16 11:02:25 【问题描述】:我创建了一个带有实体“新闻”的 CoreData 模型:
我将它设置为“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
【问题讨论】:
您必须将属性添加到模型中的实体。 那么现在有办法在 NSManagedObject 中添加属性而不修改 CoreData 模型吗?即使扩展?看起来很奇怪! 如果模型中没有定义该列,则该列不能存在于数据库中。 是的,我明白了,但没有办法将属性添加到已经存在的 CoreData 模型?我知道有一些像 NSAttributeDescription 这样的类可以帮助我创建我的自定义属性,但我找不到任何可以与现有 CoreData 模型一起使用的东西 您可以像为任何其他类添加新属性,但不能为 Core Data “管理”的类添加新属性。 【参考方案1】:您尝试的方法不起作用,因为仅声明新属性是不够的,您必须使该属性存在于数据模型中。如果您不编辑模型,则必须在代码中完成工作。
您可以在代码中修改整个模型直到您开始使用它。加载持久存储文件后,您必须将对象模型视为只读。基本步骤是
-
向
NSManagedObjectModel
询问其entities
或entitiesByName
。
在该列表中找到合适的NSEntityDescription
。
为您的新媒体资源创建一个新的NSAttributeDescription
。
将新属性添加到实体的properties
数组中。
这不是一个好主意,我强烈建议不要这样做,但这并非不可能。在多年的 Core Data 编码中,我只修改了代码中的模型一次,以解决模型编译器中的一个(自修复以来)错误。
请记住,这不会让您避免进行模型迁移。您的持久存储文件必须与您使用的数据模型相匹配。在代码中修改模型会使管理模型版本更加困难,并且会增加应用程序因模型不匹配而崩溃的几率。
【讨论】:
以上是关于斯威夫特 3 |核心数据 |自定义实体的主要内容,如果未能解决你的问题,请参考以下文章
如何让用户在具有多个 UIButtons 的视图中只选择一个自定义 UIButton?斯威夫特 3
如果 TableViewCell 有大量数据要显示,则在 UITableViewCell 中添加自定义按钮的最佳方法。使用斯威夫特