如何在Swift 2中使用与coreData的一对多关系?

时间:2015-11-15 22:04:31

标签: ios core-data swift2 one-to-many

我对使用coreData很新,并且破解了如何从单个实体保存和获取项目,但我似乎无法弄清楚如何从另一个具有“一对多”的实体中保存和获取项目关系“与第一个。我花了很多年(没有成功)尝试实施类似的问题,但更明确的解释将非常有用。

我有一个名为Group的实体,有3个属性。我的第二个实体叫做客户。

组中可能有许多客户。我发送了Group实体以在tableview中显示,一切正常。我已经编写了代码,因此当有人在tableview上点击一行时,它会将它们带到一个新的tableview,以便显示属于该组的客户。

我的实体如何设置:

extension Group {
    @NSManaged var image: NSData?
    @NSManaged var name: String?
    @NSManaged var notes: String?
    @NSManaged var roundGroupRel: NSSet?
}
extension Customer {   
    @NSManaged var custName: String?
    @NSManaged var custJob: String?
    @NSManaged var custGroupRel: RoundName?
}

我的prepareForSegue代码,我尝试将所需的信息发送到新的tableViewController,以便我可以访问该特定组的客户信息:

     if segue.identifier == "custList" {
            let indexPath = self.myIndexPath //the indexPath generated when the user tapped on a row
            let itemController : CustomersTVC = segue.destinationViewController as! CustomersTVC
            let nRound : Group = frc.objectAtIndexPath(indexPath!) as! Group
            itemController.aRound = nRound
            itemController.myGroupIndexPath = indexPath    
        }

现在,我可以执行第I组的获取请求:

import UIKit
import CoreData

class customerTVC: UITableViewController, NSFetchedResultsControllerDelegate {

    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    var frc : NSFetchedResultsController = NSFetchedResultsController()

    var myGroupIndexPath : NSIndexPath!
    var aRound : RoundName? = nil

override func viewDidLoad() {
        super.viewDidLoad()

        frc = getFetchedResultsController()
        frc.delegate = self
        do {
            try frc.performFetch()    
        } catch {
            print("Error: Failed to perform initial Fetch for Groups")
            return
        }

        let myGroup : Group = frc.objectAtIndexPath(myRoundIndexPath!) as! Group

        navigationItem.title = Group.name! +  " Customers:"
    }

    func getFetchedResultsController() -> NSFetchedResultsController {
        frc = NSFetchedResultsController(fetchRequest: roundFetchRequest(), managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        return frc
    }
    func roundFetchRequest() -> NSFetchRequest {
        let fetchRequest = NSFetchRequest(entityName: "Group")
        let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]
        return fetchRequest
    }

这是我需要帮助的地方。如何访问此特定组的客户,而不是实体客户中的所有条目?

如何向这些客户保存或添加其他条目?

我想我必须使用Predicate函数,但我无法确切地知道它是什么或它是如何工作的。

您的帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果您向我们展示您的数据模型会更好,但我假设以下集合表示组和客户之间的关系,这些关系持有与特定组关联的所有客户。您不需要从核心数据数据库执行另一次提取。只需在此集中显示客户。

@NSManaged var roundGroupRel: NSSet?