获取对象时无法访问一对多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关系的主要内容,如果未能解决你的问题,请参考以下文章

以一对多关系从 coredata 中获取所有对象

获取CoreData一对多关系的索引路径?

从 CoreData 关系中获取错误实体的对象

核心数据 - 以一对多关系访问实例与获取请求?

CoreData:通过关系访问对象

CoreData 获取实体