核心数据一对多Swift

时间:2016-04-23 04:44:02

标签: ios swift uitableview core-data relationship

我的问题是关于Core Data one-to-many relationship,目前我的应用程序可以让用户输入员工信息并保存到core data,然后更新employee表视图。我面临的问题是employee和交付之间的关系。我正在尝试在employee表格视图中点击employee时显示特定的员工交付。从employee tableView中选择一名员工后,我希望它转到另一个tableview,并在另一个UITableview中显示员工交付。

我想要完成的事情:

1) Display Specific Employee's Deliveries

2) Add deliveries to the NSSet

以下是我的两个managedObjects

extension Delievery {

    @NSManaged var address: String?
    @NSManaged var phoneNumber: String?
    @NSManaged var subTotal: NSNumber?
    @NSManaged var total: NSNumber?
    @NSManaged var employee: Employee?

}

extension Employee {

    @NSManaged var first: String?
    @NSManaged var last: String?
    @NSManaged var phoneNumber: String?
    @NSManaged var wage: NSNumber?
    @NSManaged var id: NSNumber?
    @NSManaged var delievery: NSSet?

}

我如何准备从employeeTableViewControllerdeliveryTableViewContorller

的segue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue == "DelieverySegue"{
        let employeeDeliveries = segue.destinationViewController as! DelieveryTableViewController



        let indexPath = self.tableView.indexPathForSelectedRow



        let selectedEmployee = employees[indexPath!.row]

        employeeDeliveries.employee = selectedEmployee





    }
}

deliveryTableViewController的变量是

var employee: NSManagedObject!


var deliveries : [NSManagedObject]!


var managedObjectContext : NSManagedObjectContext!

在这张照片中,它显示了我deliveryTableViewController的其余部分我遇到的问题是如何在numberOfRowsInSection函数中返回特定员工的交付金额以及如何获取交付的员工。 deliveryTableViewController set up

在最后一张照片中,我的问题是如何将此交付条目添加到所选的员工中?这就是我目前保存交货条目的方式 how i save my delivery entries

如果你做到这一点,我很感激你看我的问题。如果有人能帮我解决这个问题,我会很感激,如果你觉得我已经留下了一些需要的信息,请告诉我。

更新:

这是DelieveryTableViewController的图片(是的,我知道拼写错误的交付)

Picture of DelieveryTableViewController with viewDidLoad()

还需要设置NSPredicate

Picture of DeliveryTableViewController fetchRequest function

这是我正准备在EmployeeTableViewController中使用segue

enter image description here

这些是EmployeeTableViewController的变量

enter image description here

1 个答案:

答案 0 :(得分:1)

设置关系

使用一对多关系,最简单的方法是设置一对一关系:

delivery.employee = employee

将此行放在completeOrder方法中(您可能需要传递前一个VC的employee引用)。 CoreData会自动为您设置反向关系,将delivery添加到deliveries的{​​{1}}集。

在表格视图中显示交货

设置关系后,employee的{​​{1}}属性包含一组与其相关的deliveries个对象。要在表格视图中显示这些内容,请从此集合中创建employee数组(例如,在Delivery中):

deliveries

您的viewDidLoad可以只使用deliveries = employee.delivery.allObjects() numberOfRowsInSection可以使用deliveries.count来确定每个小区中显示的cellForRowAtIndexPath

(另一种方法是以正常方式获取deliveries[indexPath.row]数组,但要使用谓词将结果限制为与Delivery相关的结果:

deliveries

从长远来看,您应该考虑使用employee来设计在表格视图中显示CoreData对象。)

<强>更新

您不需要fetch.predicate = NSPredicate(format:"employee == %@", employee) 变量。只需将NSFetchedResultsController变量更改为thisEmployee类:

Employee

然后你应该能够设置

Employee

var employee : Employee! 方法中,使用

设置谓词
deliveries = employee.deliveries?.allObjects as! [NSManagedObject]

fetchDelivery()之后)。

更新2

很难看出零值的位置。要对其进行跟踪,请尝试在fetchRequest.predicate = NSPredicate(format:"employee == %@", employee) 的{​​{1}}方法中打印let fetchRequest = ....的值。如果它为零,则在employee中传递值时会出现问题。如果没有,请打印viewDidLoad等。发布结果。