斯威夫特 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 询问其entitiesentitiesByName。 在该列表中找到合适的NSEntityDescription。 为您的新媒体资源创建一个新的NSAttributeDescription。 将新属性添加到实体的properties 数组中。

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

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

【讨论】:

以上是关于斯威夫特 3 |核心数据 |自定义实体的主要内容,如果未能解决你的问题,请参考以下文章

自定义核心数据映射:在现有关系之间插入新实体

核心数据和自定义属性类型

如何让用户在具有多个 UIButtons 的视图中只选择一个自定义 UIButton?斯威夫特 3

向核心数据类添加自定义方法

如果 TableViewCell 有大量数据要显示,则在 UITableViewCell 中添加自定义按钮的最佳方法。使用斯威夫特

核心数据和自定义 NSCell