在 Swift 中使用 MagicalRecord 实例化的向下转型 CoreData 实体
Posted
技术标签:
【中文标题】在 Swift 中使用 MagicalRecord 实例化的向下转型 CoreData 实体【英文标题】:Downcast CoreData entities instantiated with MagicalRecord in Swift 【发布时间】:2014-06-30 14:31:12 【问题描述】:我的核心数据模型中有以 ICD_ 为前缀的实体。对于每个实体,我都有一个以 CD_ 为前缀的子类。以CD_为前缀的子类只实现静态getter。
当我使用 MagicalRecord 创建实体时,我必须使用前缀为 ICD_ 的类,而不是使用 CD_。否则,我有一个 SIGABRT:
"+entityForName: 在此找不到名为“CD_User”的实体 模型。”
如果我将我的 ICD_ 实体向下转换为我的 CD_Entity 它在 Objective-C 中工作。在 Swift 中,同样的事情会导致 SIGABRT。这很自然,因为分配的是父实体,而不是子类,因此通常不可能向下转换它。
所以我正在寻找一种解决方案,它允许将前缀为 CD_ 的子类与 MagicalRecord 一起使用。
【问题讨论】:
如果你的CD_*
子类只实现了静态getter,那么你为什么需要向下转型?
我同意你的观点,在 Objective-C 中它可以工作,但在 Swift 中它会导致 SIGABRT。
这听起来像是 Obj-C 中的一个错误,而 Swift 正确处理它。
尝试使用类别而不是子类来扩展您的实体。
如果您将类别保存在单独的源文件中,则不会。
【参考方案1】:
您的数据模型未正确加载,或者您使用了不正确的名称来访问实体。您可以使用-entitiesByName method on NSManagedObjectModel查看您的数据模型包含的名称
【讨论】:
我知道我在核心数据模型中的实体以 ICD_ 前缀命名。例如 ICD_User、ICD_Basket 等等...对于这些实体中的每一个,我都有以 CD_ 为前缀的子类。例如:CD_User、CD_Basket。要使用 MagicalRecord 创建实体,我必须调用带有前缀为 ICD_ 的类的方法MR_createEntity
。但我想实例化 CD_ 类而不是 ICD_ 类。我怎样才能使用 MagicalRecord 做到这一点?
所以我认为,我不需要使用-entitiesByName
方法。以上是关于在 Swift 中使用 MagicalRecord 实例化的向下转型 CoreData 实体的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 - MagicalRecord:如何在空实体上使用 findFirst
使用 MagicalRecord 预填充数据库 (swift)。 -wal 日志创建,但是,数据未复制到数据库
MagicalRecord 如何使用 CocoaPods 设置新的 Swift 项目使用:branch => 'develop' 即 2.3.0-beta.5
使用 Swift 3 在 Magical Record 中保存上下文时出错