如何在核心数据中实现父子关系?

时间:2016-05-04 13:29:31

标签: swift uitableview core-data one-to-many entity-relationship

我有一个场景,我需要使用核心数据实现父子关系。

方案是,在表格视图中,我有一个团队列表(可以通过用户输入添加团队),在另一个表格视图中,还有一个成员列表,这些成员也是通过用户输入添加的。

我坚持的地方是,我无法实现两个表之间的关系。我可以添加团队和成员,但是当我选择团队时,它会显示我添加的所有成员。应该是,在选择一个团队时,它应该显示与其相关的成员而不是所有成员。

任何人都可以在这个场景中回答一个例子,否则我可以展示我在编码部分所做的事情,如果需要的话。

提前致谢!

团队表视图控制器

class GroupTable: UITableViewController {

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

var teamData = [Teams]()


override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func viewWillAppear(animated: Bool) {

    let request = NSFetchRequest(entityName: "Teams")

    do{
        teamData = try managedObjectContext.executeFetchRequest(request) as! [Teams]
    } catch let error as NSError {
        print("\(error), \(error.userInfo)")
    }

    self.tableView.reloadData()

}


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if teamData.count > 0{

        self.tableView.backgroundView = nil
        return teamData.count

    } else {
        let emptyLabel = UILabel(frame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height))
        emptyLabel.text = "No Teams available at the moment, create one!"
        emptyLabel.textAlignment = NSTextAlignment.Center
        self.tableView.backgroundView = emptyLabel
        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        return 0

    }

}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("groupCell", forIndexPath: indexPath) 

    let teamDetails = teamData[indexPath.row]

    cell.textLabel?.text = teamDetails.teamName
    cell.imageView?.image = teamDetails.teamImage as? UIImage
    return cell

}
}

会员表视图控制器

class MemberTableViewController: UITableViewController {

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

var memberData = [Members]()


override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

override func viewWillAppear(animated: Bool) {

    let request = NSFetchRequest(entityName: "Members")

    do{
        memberData = try managedObjectContext.executeFetchRequest(request) as! [Members]
    } catch let error as NSError {
        print("\(error), \(error.userInfo)")
    }

    self.tableView.reloadData()

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows

    if memberData.count > 0{

        self.tableView.backgroundView = nil
        return memberData.count

    } else {
        let emptyLabel = UILabel(frame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height))
        emptyLabel.text = "No Members in the team, add one!"
        emptyLabel.textAlignment = NSTextAlignment.Center
        self.tableView.backgroundView = emptyLabel
        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        return 0

    }

}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("memberCell", forIndexPath: indexPath) as! ScreenThreeTableViewCell

    // Configure the cell...

    let memberDetails = memberData[indexPath.row]

    cell.memberName?.text = memberDetails.memberName
    cell.memberDesignation?.text = memberDetails.memberDesignation
    cell.memberImage?.image = memberDetails.memberImage as? UIImage

    return cell
}

我的ER模型 enter image description here

1 个答案:

答案 0 :(得分:3)

您在会员视图控制器中的viewWillAppear只会抓取所有Members,因此您所看到的并不奇怪。您需要告诉成员视图控制器它应该使用哪个Teams

有多种方法可以做到这一点。一个是:

  • Teams类型的成员视图控制器中添加属性。像var team : Teams?
  • 之类的东西
  • 实施prepareForSegue并让它查找所选团队并将其分配给目标视图控制器中的team属性。像

    这样的东西
    let indexPath = tableView.indexPathForSelectedRow
    let selectedTeam = teamData[indexPath.row]
    destinationViewController.team = selectedTeam
    
  • 在成员视图控制器的提取请求中使用谓词,类似

    let predicate = NSPredicate(format:"team = %@", team)
    

然后,您只需提取属于所选Members的{​​{1}}。

相关问题