获取对象时无法访问一对多CoreData关系
Posted
技术标签:
【中文标题】获取对象时无法访问一对多CoreData关系【英文标题】:One to many CoreData relationship cannot be accessed when the object is fetched 【发布时间】:2014-08-12 11:21:51 【问题描述】:我创建了一个数据模型,我有一个任务。这个任务有几个变量,但也有一个与事件的一对多链接。这些事件可能是添加的图片或 cmets,因此一项任务可能有许多事件。我已将它们链接起来,如下所示:
实体文件也设置好了:
import CoreData
class Task: NSManagedObject
@NSManaged var area : Area
@NSManaged var pictures : [TaskPicture]
@NSManaged var events : [Event]
@NSManaged var requestedByDept : NSString?
@NSManaged var requestedByUser : NSString?
@NSManaged var workloadDept : NSString?
@NSManaged var detailDescription : NSString?
@NSManaged var status : NSString
@NSManaged var uniqueId : NSString?
@NSManaged var isActive : NSNumber
@NSManaged var created : NSDate?
@NSManaged var modified : NSDate?
@NSManaged var thumbnail : NSData?
和
import CoreData
class Event: NSManagedObject
@NSManaged var task : Task
@NSManaged var actionBy : NSString?
@NSManaged var detailDescription : NSString?
@NSManaged var status : NSString
@NSManaged var uniqueId : NSString?
@NSManaged var isActive : NSNumber
@NSManaged var created : NSDate?
@NSManaged var modified : NSDate?
@NSManaged var type : NSString
对我来说,这些看起来都是正确的,但我可能错了。然后我在我的一个视图控制器中获取所有任务
var fetchedResultsController: NSFetchedResultsController
if _fetchedResultsController != nil
return _fetchedResultsController!
let fetchRequest = NSFetchRequest()
let entity = NSEntityDescription.entityForName("Task", inManagedObjectContext: self.managedObjectContext)
fetchRequest.entity = entity
fetchRequest.fetchBatchSize = 20
let sortDescriptor = NSSortDescriptor(key: "created", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
aFetchedResultsController.delegate = self
_fetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !_fetchedResultsController!.performFetch(&error)
println("Unresolved error \(error)")
abort()
return _fetchedResultsController!
我可以向您保证,managedObjectContext 是最新的并且正确传递。如果我尝试访问事件数组,就会出现问题。我使用
获取每个任务let foundTask : Task = self.fetchedResultsController.objectAtIndexPath(indexPath) as Task
在 tableView 中使用 cellForRowAtIndexPath。这再次有效,但是当我尝试let event = foundTask.events[0]
或类似的东西时,我收到消息崩溃
-[_NSFaultingMutableSet objectAtIndex:]: unrecognized selector sent to instance 0x17022e9c0
我尝试将数组转换为 NSArray 并使用 .firstObject 之类的函数,并将其放入 NSSet 中,但它从不允许我访问事件。似乎在获取任务时,事件没有,因此出现数据错误。我希望它在我需要它们时获取事件,但同样,它没有这样做。很抱歉这篇长文,但我想包含尽可能多的信息,因为我觉得你需要帮助我。请询问您是否需要更多信息,我会尽快回复。
非常感谢
【问题讨论】:
【参考方案1】:Core Data 中的(无序)多对多关系表示为NSSet
,而不是数组,
所以属性应该声明为
@NSManaged var events: NSSet
要将集合转换为数组,请使用allObjects
:
let events = foundTask.events.allObjects as [Event]
请注意,Xcode 可以为您创建托管对象子类(Editor -> Create NSManagedObject 子类...),我建议避免这种错误。
【讨论】:
感谢您的快速回复。我不知道类创建者,但将来会使用它。我刚刚试了一下,效果很好。 @Martin R 有没有办法直接联系你?我在执行上述操作时遇到了问题 除了这个答案,我还建议查看 Mogenerator 以创建和维护 NSManagedObject 子类:rentzsch.github.io/mogenerator @imnk:这绝对是一个选择。但从 Xcode 8 开始,Xcode 也可以创建(并自动更新)托管对象子类。 @MartinR 是的,这是真的,但 Mogenerator 在创建类和带有下划线前缀的超类的方法上略有不同。这对于将自定义的定制行为与自动生成的需求区分开来很有用。以上是关于获取对象时无法访问一对多CoreData关系的主要内容,如果未能解决你的问题,请参考以下文章