我的问题是关于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?
}
我如何准备从employeeTableViewController
到deliveryTableViewContorller
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的图片(是的,我知道拼写错误的交付)
还需要设置NSPredicate
这是我正准备在EmployeeTableViewController中使用segue
这些是EmployeeTableViewController的变量
答案 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
等。发布结果。