核心数据一对多Swift [英] Core Data One-To-Many Swift

查看:173
本文介绍了核心数据一对多Swift的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题是关于核心数据 一对多关系我有我的应用程序能够让用户输入员工信息并保存到核心数据,然后更新员工表视图。我面对的问题是员工和交付之间的关系。 Im当前试图在员工表视图中单击员工时显示特定员工的交货。从employee tableView中选择一个员工后,我想让它连接到另一个表格,并在另一个 UITableview 中显示员工的交货。



我要达成的目标:

  1)显示特定雇员的交货

2 )将交付添加到NSSet

这是我的两个 managedObjects

  extension Delievery {

@NSManaged var address:String?
@NSManaged var phoneNumber:String?
@NSManaged var subTotal:NSNumber?
@NSManaged var total:NSNumber?
@NSManaged var employee: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?

}

如何准备segue从 employeeTableViewController 至 deliveryTableViewContorller

  override func prepareForSegue (segue:UIStoryboardSegue,sender:AnyObject?){
如果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 函数中返回特定员工的交货量,以及如何获取员工的交货。
的DelieveryTableViewController的图片



也需要设置NSPredicate





这是我正在准备的EmployeeTableViewController中的segue





这些是我的变数EmployeeTableViewController



解决方案

设置关系



对于一对多关系,最容易设置一对一的关系:

  delivery.employee = employee 

将此行放入您的 completeOrder 方法(您可能需要传递来自以前的VC的 employee 引用) 。 CoreData会自动为您设置反向关系,将 添加到交付 employee



显示表格视图中的交货



设置关系后, employee 交货属性包含一组交货与其相关的对象。要在表视图中显示这些,请从此集合中创建 deliveries 数组(例如 viewDidLoad ):

  deliveries = employee.delivery.allObjects()

您的 numberOfRowsInSection 可以使用 deliveries.count cellForRowAtIndexPath 可以使用 deliveries [indexPath.row] 来确定哪个交付



(另一种方法是以正常方式获取 deliveries 数组,将结果限制为与您的员工相关的谓词

  fetch.predicate = NSPredicate(format:employee ==%@,employee)

您应该考虑使用 NSFetchedResultsController ,这是为在表视图中显示CoreData对象而设计的。)



更新



您不需要 thisEmployee 变量。只需将 Employee 变量更改为 Employee class:

  var employee:Employee! 

那么你应该能够设置

  deliveries = employee.deliveries?.allObjects as! [NSManagedObject] 

fetchDelivery()方法,用

设置谓词

  fetchRequest.predicate = NSPredicate(format:employee ==%@,employee)

)。



更新2



很难看出nil值。要跟踪它,尝试在 DelieveryTableViewController的 viewDidLoad 方法中打印 employee 。如果没有,传递 prepareForSegue 中的值会有问题。如果没有,请打印 employee.deliveries 等。发布结果。


The question i have is in regards to a Core Data one-to-many relationship as of right now i have my app being able to let the user input employee information and saving to core data, then updating the employee table view. The problem i face is the relationship between the employee and delivery. Im currently trying to display a specific employees deliveries when clicking on an employee in the employee table view. After selecting an employee from the employee tableView i want it to segue to another tableview and display the employees deliveries in another UITableview.

What I'm trying to Accomplish:

1) Display Specific Employee's Deliveries

2) Add deliveries to the NSSet

Here are my two 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?

}

how i prepared for segue from employeeTableViewController to 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





    }
}

The variables of the deliveryTableViewController are

var employee: NSManagedObject!


var deliveries : [NSManagedObject]!


var managedObjectContext : NSManagedObjectContext!

In this photo it shows the rest of my deliveryTableViewController the problem i have is how do i return the amount of deliveries for a specific employee in the numberOfRowsInSection function and how do i fetch the deliveries of the employee. deliveryTableViewController set up

In this last photo my question is how to i add this delivery entry to the employee selected? this is how I'm currently saving my delivery entries how i save my delivery entries

If you made it this far i appreciate you looking through my problem. If anyone can help me the slightest with this issue i'd appreciate it if you feel i've left some information out that is needed please let me know.

UPDATE:

Here is the picture of the DelieveryTableViewController (yes i know i spelt delivery wrong)

also need to set the NSPredicate

this is home I'm preparing for segue in EmployeeTableViewController

these are my variables for EmployeeTableViewController

解决方案

Setting the relationship

With one to many relationships, it is easiest to set the to-one relationship:

delivery.employee = employee

Put this line in your completeOrder method (you may need to pass the employee reference from a previous VC). CoreData will automatically set the inverse relationship for you, adding delivery to the deliveries set for the employee.

Showing the Deliveries in a Table View

Having set the relationship, the deliveries property of employee contains a set of Delivery objects to which it is related. To display these in a table view, create your deliveries array from this set (eg. in viewDidLoad):

deliveries = employee.delivery.allObjects()

Your numberOfRowsInSection can then just use deliveries.count and the cellForRowAtIndexPath can use deliveries[indexPath.row] to determine which Delivery to display in each cell.

(An alternative is to fetch the deliveries array in the normal way, but to use a predicate to restrict the results to those that are related to your employee:

fetch.predicate = NSPredicate(format:"employee == %@", employee)

Longer term, you should consider using NSFetchedResultsController which is designed for displaying CoreData objects in table view.)

Update

You don't need the thisEmployee variable. Just change the Employee variable to be Employee class:

var employee : Employee!

Then you should be able to set

deliveries = employee.deliveries?.allObjects as! [NSManagedObject]

And in your fetchDelivery() method, set the predicate with

fetchRequest.predicate = NSPredicate(format:"employee == %@", employee)

(after let fetchRequest = ....).

Update 2

It's difficult to see where the nil value is. To track it down, try printing the value of employee in the viewDidLoad method of the DelieveryTableViewController. If it's nil, there is a problem with passing the value in prepareForSegue. If not, print employee.deliveries, etc. Post your results.

这篇关于核心数据一对多Swift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆