在 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_UserICD_Basket 等等...对于这些实体中的每一个,我都有以 CD_ 为前缀的子类。例如:CD_UserCD_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 中保存上下文时出错

无法在具有 MagicalRecord [核心数据] 的实体中分配给 ...

Magical Record 删除所有记录 Swift