ios – 获取对象时无法访问一对多CoreData关系

前端之家收集整理的这篇文章主要介绍了ios – 获取对象时无法访问一对多CoreData关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了一个dataModel,我有一个任务.此任务有几个变量,但也有一个与事件的一对多链接.这些事件可能是添加图片评论内容,因此一项任务可能会有很多事件.我把它们联系起来,如下所示:

实体文件也设置为:

  1. import CoreData
  2.  
  3. class Task: NSManagedObject {
  4.  
  5. @NSManaged var area : Area
  6. @NSManaged var pictures : [TaskPicture]
  7. @NSManaged var events : [Event]
  8.  
  9. @NSManaged var requestedByDept : NSString?
  10. @NSManaged var requestedByUser : NSString?
  11. @NSManaged var workloadDept : NSString?
  12. @NSManaged var detailDescription : NSString?
  13. @NSManaged var status : NSString
  14. @NSManaged var uniqueId : NSString?
  15. @NSManaged var isActive : NSNumber
  16. @NSManaged var created : NSDate?
  17. @NSManaged var modified : NSDate?
  18. @NSManaged var thumbnail : NSData?
  19.  
  20. }

  1. import CoreData
  2.  
  3. class Event: NSManagedObject {
  4.  
  5.  
  6. @NSManaged var task : Task
  7.  
  8. @NSManaged var actionBy : NSString?
  9. @NSManaged var detailDescription : NSString?
  10. @NSManaged var status : NSString
  11. @NSManaged var uniqueId : NSString?
  12. @NSManaged var isActive : NSNumber
  13. @NSManaged var created : NSDate?
  14. @NSManaged var modified : NSDate?
  15. @NSManaged var type : NSString
  16.  
  17. }

对我来说,这些看起来都很正确,但我可能错了.然后我在我的一个viewControllers中获取所有任务

  1. var fetchedResultsController: NSFetchedResultsController {
  2. if _fetchedResultsController != nil {
  3. return _fetchedResultsController!
  4. }
  5.  
  6. let fetchRequest = NSFetchRequest()
  7. let entity = NSEntityDescription.entityForName("Task",inManagedObjectContext: self.managedObjectContext)
  8. fetchRequest.entity = entity
  9.  
  10. fetchRequest.fetchBatchSize = 20
  11.  
  12. let sortDescriptor = NSSortDescriptor(key: "created",ascending: false)
  13.  
  14. fetchRequest.sortDescriptors = [sortDescriptor]
  15.  
  16. let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,managedObjectContext: self.managedObjectContext,sectionNameKeyPath: nil,cacheName: nil)
  17. aFetchedResultsController.delegate = self
  18. _fetchedResultsController = aFetchedResultsController
  19.  
  20. var error: NSError? = nil
  21. if !_fetchedResultsController!.performFetch(&error) {
  22. println("Unresolved error \(error)")
  23. abort()
  24. }
  25.  
  26. return _fetchedResultsController!
  27. }

我可以向您保证,managedObjectContext既是最新的,也是正确传递的.如果我尝试访问事件数组,则会出现问题.我使用获取每个任务

  1. let foundTask : Task = self.fetchedResultsController.objectAtIndexPath(indexPath) as Task

使用cellForRowAtIndexPath,因为它在tableView中.这再次有效,但是当我尝试let event = foundTask.events [0]或类似的东西时,我的消息崩溃了

  1. -[_NSFaultingMutableSet objectAtIndex:]: unrecognized selector sent to instance 0x17022e9c0

我已经尝试将数组转换为NSArray并使用像.firstObject这样的函数,并且还将它放入NSSet但它永远不会让我访问事件.看起来当提取任务时,事件不是,因此给出了数据错误.我希望它能在我需要它时获取事件,但同样,它不会这样做.对不起,很长的帖子,但我希望包含尽可能多的信息,因为我觉得你需要帮助我.请询问您是否需要更多信息,我会尽快回复.

非常感谢

解决方法

Core Data中的(无序)to-many关系表示为NSSet,而不是数组,
所以财产应该声明为
  1. @NSManaged var events: NSSet

要将集转换为数组,请使用allObjects:

  1. let events = foundTask.events.allObjects as [Event]

请注意,Xcode可以为您创建托管对象子类(编辑器 – >创建NSManagedObject Subclass …),我建议我避免这种错误.

猜你在找的iOS相关文章