【问题标题】:My Swift fetch request return objects with the wrong relation我的 Swift 获取请求返回关系错误的对象
【发布时间】:2014-10-21 18:13:23
【问题描述】:

我对 Swift 和 Core Data 很陌生,但我想我已经掌握了基础知识。但是,我在一个简单的核心数据模型中遇到了问题,我想在该模型中获取与一对多关系中的另一个实体相关的所有实体。我想要做的是在表格视图中选择一个父对象并在另一个视图中显示其子元素。

所以我使用以下代码从ParentsVC 传递父对象:

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let CHILDREN_TAB_INDEX = 1
        var navigationController = self.tabBarController?.viewControllers?[CHILDREN_TAB_INDEX] as UINavigationController
        if navigationController.topViewController is ChildrenVC {
            var childrenVC = navigationController.topViewController as ChildrenVC
            let parent = self.fetchedResultsController.objectAtIndexPath(self.menuTableView.indexPathForSelectedRow()!) as Parent
            childrenVC.currentParent = parent
            self.tabBarController?.selectedIndex = CHILDREN_TAB_INDEX
        }
    }

然后在 ChildrenVC 中,我执行以下获取来获取子对象:

var _fetchedResultsController: NSFetchedResultsController? = nil

var fetchedResultsController: NSFetchedResultsController {
    if _fetchedResultsController != nil {
        return _fetchedResultsController!
    }
    let moc:NSManagedObjectContext = coreDataHelper.backgroundContext!
    let fetchRequest = NSFetchRequest()
    let entity = NSEntityDescription.entityForName("Child", inManagedObjectContext: moc)
    fetchRequest.entity = entity
    fetchRequest.fetchBatchSize = 20
    let sortDescriptor = NSSortDescriptor(key: "name", ascending: false)
    let predicate = NSPredicate(format: "parent == %@", self.currentParent)
    fetchRequest.predicate = predicate
    let sortDescriptors = [sortDescriptor]
    fetchRequest.sortDescriptors = [sortDescriptor]

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: "Master")
        aFetchedResultsController.delegate = self
        _fetchedResultsController = aFetchedResultsController

    var error: NSError? = nil
    if !_fetchedResultsController!.performFetch(&error) {
        abort()
        }
    _fetchedResultsController?.delegate = self
    return _fetchedResultsController!
}

以及添加新孩子的代码(在 ParentsVC 中完成):

func addNewParent(parentName:String) {
    let moc:NSManagedObjectContext = coreDataHelper.backgroundContext!
    var parent:Parent = NSEntityDescription.insertNewObjectForEntityForName("Parent", inManagedObjectContext: moc) as Parent
    parent.name = parentName
    for n in 1...5 {
        var child:Child = NSEntityDescription.insertNewObjectForEntityForName("Child", inManagedObjectContext: moc) as Child
        child.name = "A"
        child.parent = parent
    }
    coreDataHelper.saveContext(moc)
    menuTableView.reloadData()
}

我不会根据我点击的父级列出不同的子元素,而是会得到相同的子级(无论我选择哪个父级)(子级在 ChildrenVC 中是可编辑的,因此我可以分辨出区别)。但是当我重新启动/重建应用程序时,我会随机获得另一组显示给所有父母的孩子。我在这里错过了什么?

【问题讨论】:

    标签: ios xcode core-data swift


    【解决方案1】:

    找到了!我只是忘记在 ChildrenVC 中重置 self._fetchedResultsController。所以传递对象的代码应该是:

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let CHILDREN_TAB_INDEX = 1
        var navigationController = self.tabBarController?.viewControllers?[CHILDREN_TAB_INDEX] as UINavigationController
        if navigationController.topViewController is ChildrenVC {
            var childrenVC = navigationController.topViewController as ChildrenVC
            let parent = self.fetchedResultsController.objectAtIndexPath(self.menuTableView.indexPathForSelectedRow()!) as Parent
            childrenVC.currentParent = parent
            childrenVC._fetchedResultsController = nil
            self.tabBarController?.selectedIndex = CHILDREN_TAB_INDEX
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      相关资源
      最近更新 更多