CoreData 使用父实体创建 NSManagedObject 子类

Posted

技术标签:

【中文标题】CoreData 使用父实体创建 NSManagedObject 子类【英文标题】:CoreData creating an NSManagedObject Subclass with a Parent Entity 【发布时间】:2014-11-11 20:23:00 【问题描述】:

我们有一个 Swift 应用程序,它有 10-12 个数据模型。设置它们的开发人员在 .xcdatamodeld 文件中生成它们,我已经为它们编写了扩展。

在应用程序中,我意识到他未能为名为“文件”的数据模型之一生成子类。我尝试使用 Editor -> Create NSManagedObject Subclass 添加它,向导完成后,没有出现错误,但子类也没有出现。假设它可能是 XCode 中的错误,我按照其他格式编写了自己的 Files 子类。它非常基本:

import Foundation
import CoreData

class Files: NSManagedObject 

    @NSManaged var localUrl: String
    @NSManaged var remoteUrl: String
    @NSManaged var type: String
    @NSManaged var translationFromAudio: NSSet
    @NSManaged var translationToAudio: NSSet

在此之后,我继续为我们的项目解析 JSON 并将数据推送到 coreData

let entityDescription: AnyObject = NSEntityDescription.entityForName("Files", inManagedObjectContext: context)!

var request = NSFetchRequest(entityName: "Files")
request.predicate = NSPredicate(format: "remoteUrl == %@", urlString)
var file:Files


var results = context.executeFetchRequest(request, error: nil)! as NSArray

if results.firstObject != nil
    file = results.firstObject as Files
else
file = Files(entity: entityDescription as NSEntityDescription, insertIntoManagedObjectContext: context)


file.remoteUrl = audiostring
file.type = "Institutional"
//All the other properties on a file are optional, so I did not include them

一切正常且花花公子(这与我们用来将其他所有内容保存到 CoreData 中的格式相同,只是替换了 File 的属性)在所有解析完成后运行 context.save() 以加速应用程序,但它叫做。

当我尝试运行 FetchRequest 从 coreData 获取所有文件时,疯狂的事情开始发生。它以 0 个对象的形式返回,但所有其他 coreData 模型都返回。

然后我尝试从模拟器中删除应用程序并重新加载它,在再次解析后执行此操作时,根本没有任何内容保存到核心数据中。

我已经回滚了两次我的代码,并且仔细地做了所有的事情,结果还是一样。我猜这可能与 Files 子类未正确生成的原始问题有关。任何关于如何刷新你的子类的信息,或者关于我可能做错的想法都非常感谢,我对 Swift 和 XCode 还很陌生,所以一切对我来说仍然很新。谢谢!

编辑

下面的解决方案解决了我原来的问题,但我还有两个新问题:

    为什么我不能从菜单 Editor->Create NSManagedObject Subclass 自动生成子类。 我应该如何格式化我的子类“文件”以从父实体继承原始功能。

【问题讨论】:

【参考方案1】:

所以,我已经修复了它,并且修复后产生了更多问题。

在实体编辑器中,我选择了实体“文件”,在右侧的实体菜单中(右侧菜单的第三个选项卡,我注意到父实体下拉菜单选择了一个父实体,而所有其他人都有“没有父实体”。这样做后,将我的应用程序从模拟器中删除并刷新,功能恢复,CoreData 恢复其正常功能。

这引发了两个后续问题: 1. 为什么我不能从菜单Editor->Create NSManagedObject Subclass 中自动生成子类。 2. 我应该如何格式化我的子类“文件”以从父实体继承作为原始功能所指示的。

【讨论】:

以上是关于CoreData 使用父实体创建 NSManagedObject 子类的主要内容,如果未能解决你的问题,请参考以下文章

在 CoreData 中迁移实体父级

如何从关系实体中进行简单的提取?迅速

如何更新CoreData中另一个实体的子实体

NSManagedObject CoreData 中的父子层次结构

自定义 NSFetchreqeust - 按子 NSSet 属性排序父实体 [MagicalRecord+Coredata]

CoreData 关系与属性