ข้อมูลหลัก Swift แบบหนึ่งต่อหลายรายการ

คำถามที่ฉันมีเกี่ยวกับ Core Data one-to-many relationship ณ ตอนนี้ฉันมีแอปที่สามารถให้ผู้ใช้ป้อนข้อมูลพนักงานและบันทึกเป็น core data จากนั้นอัปเดตมุมมองตาราง 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 แล้ว

ในรูปสุดท้ายนี้ คำถามของฉันคือ ฉันจะเพิ่มรายการจัดส่งนี้ให้กับพนักงานที่เลือกได้อย่างไร นี่คือวิธีที่ฉันกำลังบันทึกรายการจัดส่ง ฉันจะบันทึกรายการจัดส่งได้อย่างไร

หากคุณทำมาไกลขนาดนี้ ฉันขอขอบคุณที่คุณมองผ่านปัญหาของฉัน หากใครสามารถช่วยฉันแม้แต่น้อยในเรื่องนี้ ฉันยินดีเป็นอย่างยิ่งหากคุณรู้สึกว่าฉันได้ทิ้งข้อมูลบางอย่างที่จำเป็นไว้ โปรดแจ้งให้เราทราบ

อัปเดต:

นี่คือรูปภาพของ DelieveryTableViewController (ใช่ ฉันรู้ว่าฉันสะกดการส่งผิด)

รูปภาพของ DelieveryTableViewController พร้อม viewDidLoad()

ต้องตั้งค่า NSPredicate ด้วย

รูปภาพของฟังก์ชัน fetchRequest DeliveryTableViewController

นี่คือบ้าน ฉันกำลังเตรียมทำต่อใน EmployeeTableViewController

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือตัวแปรของฉันสำหรับ EmployeeTableViewController

ป้อนคำอธิบายรูปภาพที่นี่


person fizzy    schedule 23.04.2016    source แหล่งที่มา
comment
อะไรที่ไม่ได้ผลสำหรับคุณ? ฉันเห็นว่าคุณสะกดส่วนขยายของคุณว่า 'Delievery' แทนที่จะเป็น 'Delivery' และสิ่งนี้เป็นจริงสำหรับสิ่งอื่นๆ สองสามอย่าง เช่น รหัส segue และ 'DelieveryTableViewController' ของคุณ เป็นต้น แม้ว่าข้อผิดพลาดเหล่านี้อาจหักล้างกัน แต่ถ้าคุณสะกดผิด มันมักจะแยกแยะว่ามันเป็นสาเหตุของข้อผิดพลาดอย่างแน่นอน คุณเห็นพฤติกรรมอะไรบ้าง?   -  person Magnas    schedule 23.04.2016
comment
@fizzy อัปเดตคำตอบของฉัน   -  person pbasdf    schedule 24.04.2016
comment
รหัสในภาพหน้าจอน่ารำคาญ กรุณาวางรหัสเป็นข้อความ   -  person Warren P    schedule 25.04.2016
comment
ขออภัย เราจะดำเนินการเมื่อส่งคำถามใหม่   -  person fizzy    schedule 25.04.2016


คำตอบ (1)


การตั้งค่าความสัมพันธ์

ด้วยความสัมพันธ์แบบหนึ่งต่อหลายความสัมพันธ์ การตั้งค่าความสัมพันธ์แบบต่อหนึ่งจะง่ายที่สุด:

delivery.employee = employee

ใส่บรรทัดนี้ในวิธีการ completeOrder ของคุณ (คุณอาจต้องผ่านการอ้างอิง employee จาก VC ก่อนหน้า) CoreData จะตั้งค่าความสัมพันธ์แบบผกผันให้คุณโดยอัตโนมัติ โดยเพิ่ม delivery ไปยังชุด deliveries สำหรับ employee

การแสดงการส่งมอบในมุมมองตาราง

เมื่อตั้งค่าความสัมพันธ์แล้ว คุณสมบัติ deliveries ของ employee จะมีชุดของอ็อบเจ็กต์ Delivery ที่เกี่ยวข้องกัน หากต้องการแสดงสิ่งเหล่านี้ในมุมมองตาราง ให้สร้างอาร์เรย์ deliveries ของคุณจากชุดนี้ (เช่น ใน viewDidLoad):

deliveries = employee.delivery.allObjects()

จากนั้น numberOfRowsInSection ของคุณสามารถใช้ deliveries.count และ cellForRowAtIndexPath สามารถใช้ deliveries[indexPath.row] เพื่อกำหนดว่า Delivery ใดที่จะแสดงในแต่ละเซลล์

(อีกทางเลือกหนึ่งคือการดึงอาร์เรย์ deliveries ด้วยวิธีปกติ แต่ให้ใช้เพรดิเคตเพื่อจำกัดผลลัพธ์ไว้เฉพาะที่เกี่ยวข้องกับ employee ของคุณ:

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

ในระยะยาว คุณควรพิจารณาใช้ NSFetchedResultsController ซึ่งออกแบบมาเพื่อแสดงออบเจ็กต์ CoreData ในมุมมองตาราง)

อัปเดต

คุณไม่จำเป็นต้องมีตัวแปร thisEmployee เพียงเปลี่ยนตัวแปร Employee ให้เป็นคลาส Employee:

var employee : Employee!

จากนั้นคุณควรจะสามารถตั้งค่าได้

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

และในเมธอด fetchDelivery() ของคุณ ให้ตั้งค่าภาคแสดงด้วย

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

(หลัง let fetchRequest = ....)

อัปเดต 2

เป็นการยากที่จะดูว่าค่าศูนย์อยู่ที่ไหน หากต้องการติดตาม ให้ลองพิมพ์ค่า employee ในวิธี viewDidLoad ของ DelieveryTableViewController หากเป็นศูนย์ แสดงว่ามีปัญหาในการส่งค่าใน prepareForSegue ถ้าไม่ ให้พิมพ์ employee.deliveries ฯลฯ โพสต์ผลลัพธ์ของคุณ

person pbasdf    schedule 23.04.2016
comment
ขอบคุณมาก นี่ไม่ใช่แอปที่ซับซ้อนจริงๆ .. ฉันเพิ่งเริ่มเรียนรู้ Core Data และฉันยอมรับว่า NSFetchedResultsController ดีกว่ามาก .. ขอบคุณอีกครั้ง - person fizzy; 23.04.2016
comment
เฮ้ pbasdf ฉันมีคำถามสั้นๆ อีกข้อหนึ่งเกี่ยวกับการแสดงการส่งมอบในมุมมองตาราง.... เมื่อพยายามทำการส่งมอบ = Employee.delivery.allObjects() มันทำให้ฉันมีข้อผิดพลาดโดยบอกว่าฉันไม่สามารถกำหนด AnyObject ให้กับ NSMangedObject ด้วยวิธีใดก็ตาม สามารถแก้ไขได้ไหม? นี่คือรหัส: นี่คือสิ่งที่ฉันใส่ไว้ใน viewDidLoad - person fizzy; 24.04.2016
comment
ให้คำอธิบาย = NSEntityDescription.entityForName (Delievery, inManagedObjectContext: ManagedObjectContext) var delivery = Delievery (เอนทิตี: (คำอธิบาย)!, insertIntoManagedObjectContext: ManagedObjectContext) ให้ EmployeeDescription = NSEntityDescription.entityForName (พนักงาน, inManagedObjectContext: ManagedObjectContext) ให้ thisEmployee = พนักงาน (เอนทิตี :( EmployeeDescription)!, insertIntoManagedObjectContext: จัดการObjectContext) การจัดส่ง = thisEmployee.delievery?.allObjects - person fizzy; 24.04.2016
comment
คุณเพียงแค่ต้องส่งอาร์เรย์ให้ถูกต้อง: deliveries = employee.delivery.allObjects() as! [NSManagedObject] - person pbasdf; 24.04.2016
comment
โอเค ขอบคุณมาก ฉันขอโทษ ฉันยังใหม่กับ iOS และรวดเร็ว และเนื่องจากฉันมีตัวแปรชื่อ Employee : NSMangedObject! แต่เพื่อให้ได้โดยตรงฉันได้ใช้ NSEntityDescription.entityForName และ insertIntoManagedObjectContext: ถูกต้องหรือฉันทำผิด - person fizzy; 24.04.2016
comment
นั่นจะสร้าง Employee ใหม่ - นั่นคือสิ่งที่คุณต้องการใช่ไหม ฉันคิดว่าคุณกำลังส่งผ่านการอ้างอิง employee จากตัวควบคุมมุมมองก่อนหน้า - เช่นเดียวกับที่คุณทำใน prepareForSegue - person pbasdf; 24.04.2016
comment
ใช่แล้ว คุณพูดถูกแล้ว มันเพิ่มพนักงานคนอื่นอยู่เรื่อย แต่ฉันไม่สามารถทำ Employee.delivery.allObjects() ได้เพราะมันเป็นประเภท NSMangedObject ฉันจำเป็นต้องแปลงสิ่งนั้นด้วยเช่นกันหรือไม่ เพราะตอนนี้เมื่อฉันแยกระหว่าง tableViewController แต่ละตัว มันจะเพิ่มพนักงานซึ่งไม่ใช่สิ่งที่ฉันต้องการ - person fizzy; 24.04.2016
comment
คุณสามารถแก้ไขโพสต์ของคุณด้านบนและใส่รหัสปัจจุบันของคุณที่ด้านล่างได้หรือไม่ และฉันจะอัปเดตคำตอบของฉันตามนั้น - ไม่สนับสนุนให้มีการอภิปรายแบบยาวในความคิดเห็น - person pbasdf; 24.04.2016
comment
สิ่งนี้ใช้งานไม่ได้เพราะฉันส่ง NSManagedObject จาก EmployeeTableViewController เมื่อฉันส่งมันใน PreparForeSegue ใน EmployeeTableViewController ในฐานะ Employee แบบนี้ EmployeeDeliveries.employee = SelectedEmployee as! พนักงานทำให้ฉันมีข้อผิดพลาดร้ายแรง: พบศูนย์โดยไม่คาดคิดขณะแกะค่าตัวเลือกเมื่อดำเนินการจัดส่งรหัส = Employee.deliveries?.allObjects as! [NSManagedObject]... ฉันขอโทษที่ทำให้สิ่งนี้ยาก Core Data เป็นแนวคิดที่ยากมากสำหรับฉันที่จะเข้าใจ - person fizzy; 24.04.2016
comment
ที่นี่ฉันจะอัปโหลด EmployeeTableViewController และแสดงให้คุณเห็นว่าฉันกำลังส่งมันอย่างไร... และตัวแปรของมัน - person fizzy; 24.04.2016
comment
โอเค ฉันอัปเดตคำถามของฉันเพียงแจ้งให้คุณทราบ โดยแสดงรูปภาพของ EmployeeTableViewController ของฉัน .. ฉันขอบคุณไม่พอสำหรับความช่วยเหลือทั้งหมด - person fizzy; 24.04.2016
comment
ฉันรู้ว่าคุณบอกว่าคุณผูกติดอยู่กับการทำบางสิ่งบางอย่าง แต่มีโอกาสใดบ้างที่คุณจะได้ดูว่าฉันอัปเดตอะไรบ้าง? @pbasdf - person fizzy; 25.04.2016
comment
ขออภัย @fizzy ฉันเพิ่งกลับมาที่คำถามของคุณ ฉันเห็นว่าคุณได้ตั้งคำถามอีกข้อที่เกี่ยวข้องโดยตรงกับศูนย์ที่ไม่คาดคิด ฉันไม่มีอะไรจะเพิ่มคำตอบและความคิดเห็นของ Marcus มากนัก - person pbasdf; 26.04.2016
comment
ฉันกำลังทำตามที่มาร์คัสแนะนำ และดูว่าฉันจะทำมันได้หรือไม่ ฉันขอขอบคุณสำหรับความช่วยเหลือทั้งหมดที่คุณทั้งคู่มอบให้ฉัน @pbsasdf - person fizzy; 26.04.2016