Data Inti Swift Satu-Ke-Banyak

Pertanyaan yang saya miliki adalah sehubungan dengan Core Data one-to-many relationship saat ini aplikasi saya dapat membiarkan pengguna memasukkan informasi karyawan dan menyimpannya ke core data, kemudian memperbarui tampilan tabel employee. Masalah yang saya hadapi adalah hubungan antara employee dan pengiriman. Saat ini saya mencoba menampilkan pengiriman karyawan tertentu ketika mengklik employee di tampilan tabel employee. Setelah memilih seorang karyawan dari tableView karyawan saya ingin itu beralih ke tampilan tabel lain dan menampilkan pengiriman karyawan di UITableview lain.

Apa yang saya coba capai:

1) Display Specific Employee's Deliveries

2) Add deliveries to the NSSet

Ini dua milikku 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?

}

bagaimana saya mempersiapkan segue dari employeeTableViewController hingga 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





    }
}

Variabel deliveryTableViewController adalah

var employee: NSManagedObject!


var deliveries : [NSManagedObject]!


var managedObjectContext : NSManagedObjectContext!

Di foto ini menunjukkan sisa deliveryTableViewController saya. Masalah yang saya hadapi adalah bagaimana cara mengembalikan jumlah pengiriman untuk karyawan tertentu di fungsi numberOfRowsInSection dan bagaimana cara mengambil pengiriman karyawan tersebut. penyiapan deliveryTableViewController

Di foto terakhir ini pertanyaan saya adalah bagaimana cara menambahkan entri pengiriman ini ke karyawan yang dipilih? beginilah cara saya menyimpan entri kiriman saya saat ini bagaimana saya menyimpan entri kiriman saya

Jika Anda berhasil sejauh ini, saya menghargai Anda telah menyelesaikan masalah saya. Jika ada yang bisa membantu saya sedikit pun dengan masalah ini, saya akan sangat menghargainya jika Anda merasa saya telah melewatkan beberapa informasi yang diperlukan, harap beri tahu saya.

MEMPERBARUI:

Berikut adalah gambar DelieveryTableViewController (ya saya tahu saya salah mengeja pengiriman)

Gambar DelieveryTableViewController dengan viewDidLoad()

juga perlu mengatur NSPredicate

Gambar fungsi pengambilanRequest DeliveryTableViewController

ini rumah. Saya sedang mempersiapkan segue di EmployeeTableViewController

masukkan deskripsi gambar di sini

ini adalah variabel saya untuk EmployeeTableViewController

masukkan deskripsi gambar di sini


person fizzy    schedule 23.04.2016    source sumber
comment
Apa sebenarnya yang tidak berhasil untuk Anda? Saya dapat melihat bahwa Anda telah mengeja ekstensi 'Delievery' dan bukan 'Delivery' dan ini berlaku untuk beberapa hal lain seperti ID segue dan 'DelieveryTableViewController' Anda, dll. Meskipun kesalahan ini mungkin membatalkan satu sama lain, jika Anda mengejanya secara konsisten pasti akan mengesampingkannya sebagai sumber kesalahan. Perilaku apa yang Anda lihat?   -  person Magnas    schedule 23.04.2016
comment
@fizzy Memperbarui jawaban saya.   -  person pbasdf    schedule 24.04.2016
comment
Kode di tangkapan layar mengganggu. Silakan tempel kode sebagai teks.   -  person Warren P    schedule 25.04.2016
comment
Maaf tentang itu, akan dilakukan ketika mengirimkan pertanyaan baru   -  person fizzy    schedule 25.04.2016


Jawaban (1)


Menetapkan hubungan

Dengan hubungan satu ke banyak, paling mudah untuk mengatur hubungan ke satu:

delivery.employee = employee

Letakkan baris ini di metode completeOrder Anda (Anda mungkin perlu meneruskan referensi employee dari VC sebelumnya). CoreData akan secara otomatis mengatur hubungan terbalik untuk Anda, menambahkan delivery ke set deliveries untuk employee.

Menampilkan Pengiriman dalam Tampilan Tabel

Setelah mengatur hubungan, properti deliveries dari employee berisi sekumpulan objek Delivery yang terkait dengannya. Untuk menampilkannya dalam tampilan tabel, buat array deliveries Anda dari kumpulan ini (mis. di viewDidLoad):

deliveries = employee.delivery.allObjects()

numberOfRowsInSection Anda kemudian dapat menggunakan deliveries.count dan cellForRowAtIndexPath dapat menggunakan deliveries[indexPath.row] untuk menentukan Delivery mana yang akan ditampilkan di setiap sel.

(Alternatifnya adalah mengambil larik deliveries dengan cara biasa, namun menggunakan predikat untuk membatasi hasil hanya pada hasil yang terkait dengan employee Anda:

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

Dalam jangka panjang, Anda harus mempertimbangkan untuk menggunakan NSFetchedResultsController yang dirancang untuk menampilkan objek CoreData dalam tampilan tabel.)

Perbarui

Anda tidak memerlukan variabel thisEmployee. Ubah saja variabel Employee menjadi kelas Employee:

var employee : Employee!

Maka Anda harus bisa mengaturnya

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

Dan dalam metode fetchDelivery() Anda, atur predikatnya dengan

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

(setelah let fetchRequest = ....).

Pembaruan 2

Sulit untuk melihat di mana nilai nihilnya. Untuk melacaknya, coba cetak nilai employee dalam metode viewDidLoad dari DelieveryTableViewController. Jika nihil, berarti ada masalah dalam meneruskan nilai di prepareForSegue. Jika tidak, cetak employee.deliveries, dll. Posting hasil Anda.

person pbasdf    schedule 23.04.2016
comment
Terima kasih banyak, ini sebenarnya bukan aplikasi yang rumit.. Saya baru mulai mempelajari Data Inti dan saya setuju NSFetchedResultsController jauh lebih baik.. Sekali lagi terima kasih - person fizzy; 23.04.2016
comment
hai pbasdf saya punya satu pertanyaan singkat lagi tentang Menampilkan Pengiriman dalam Tampilan Tabel.... ketika mencoba melakukan pengiriman = Employee.delivery.allObjects() itu memberi saya kesalahan yang mengatakan bahwa saya tidak dapat menetapkan AnyObject ke NSMangedObject dengan cara apa pun saya dapatkah memperbaikinya? ini kodenya: ini yang saya masukkan ke viewDidLoad - person fizzy; 24.04.2016
comment
biarkan deskripsi = NSEntityDescription.entityForName(Delievery, inManagedObjectContext: ManagedObjectContext) var delivery = Delievery(entitas: (deskripsi)!, insertIntoManagedObjectContext: ManagedObjectContext) biarkan EmployeeDescription = NSEntityDescription.entityForName(Karyawan, inManagedObjectContext: ManagedObjectContext) biarkan thisEmployee = Karyawan(entitas: ( EmployeeDescription)!, insertIntoManagedObjectContext: ManagedObjectContext) pengiriman = thisEmployee.delievery?.allObjects - person fizzy; 24.04.2016
comment
Anda hanya perlu melemparkan array dengan benar: deliveries = employee.delivery.allObjects() as! [NSManagedObject] - person pbasdf; 24.04.2016
comment
oke terima kasih banyak Maaf saya baru mengenal iOS dan Swift dan karena saya memiliki variabel bernama Employee : NSMangedObject! tetapi untuk langsung memahaminya saya telah menggunakan NSEntityDescription.entityForName dan insertIntoManagedObjectContext: benar atau apakah saya melakukan ini salah? - person fizzy; 24.04.2016
comment
Itu akan membuat Employee baru - apakah itu yang Anda inginkan? Saya pikir Anda meneruskan referensi employee dari pengontrol tampilan sebelumnya - seperti yang Anda lakukan di prepareForSegue - person pbasdf; 24.04.2016
comment
ya benar, Anda benar, ia terus menambahkan karyawan lain, tetapi saya tidak dapat melakukan Employee.delivery.allObjects() karena tipenya NSMangedObject, apakah saya perlu menjadikannya sebagai sesuatu juga? karena sekarang ketika saya memisahkan antara setiap tableViewController ia menambahkan karyawan yang bukan itu yang saya inginkan. - person fizzy; 24.04.2016
comment
Bisakah Anda mengedit postingan Anda di atas dan meletakkan kode Anda saat ini di bagian bawah; dan saya akan memperbarui jawaban saya sesuai - diskusi panjang lebar di komentar tidak disarankan. - person pbasdf; 24.04.2016
comment
ini tidak berhasil karena saya mengirim NSManagedObject dari EmployeeTableViewController. Ketika saya memasukkannya ke dalam prepForeSegue di EmployeeTableViewController sebagai Karyawan seperti ini EmployeeDeliveries.employee = SelectedEmployee as! Karyawan itu memberi saya kesalahan kesalahan fatal: tiba-tiba ditemukan nil saat membuka bungkus nilai Opsional saat menjalankan kode delivery = Employee.deliveries?.allObjects as! [NSManagedObject]... Saya minta maaf karena membuat Data Inti ini begitu sulit menjadi konsep yang sangat sulit untuk saya pahami - person fizzy; 24.04.2016
comment
di sini saya akan mengunggah EmployeeTableViewController dan menunjukkan kepada Anda bagaimana saya mengirimkannya... dan variabelnya - person fizzy; 24.04.2016
comment
okok saya memperbarui pertanyaan saya hanya untuk memberi tahu Anda, menampilkan gambar EmployeeTableViewController saya.. saya tidak bisa cukup berterima kasih atas semua bantuannya - person fizzy; 24.04.2016
comment
Saya tahu Anda bilang Anda sibuk melakukan sesuatu, tetapi adakah kesempatan Anda melihat apa yang saya perbarui? @pbasdf - person fizzy; 25.04.2016
comment
Maaf, @fizzy, saya baru saja menjawab pertanyaan Anda. Saya melihat Anda telah mengajukan pertanyaan lain yang berkaitan langsung dengan nihil yang ditemukan secara tidak terduga; Saya tidak perlu banyak menambahkan jawaban dan komentar Marcus di sana. - person pbasdf; 26.04.2016
comment
Saya melakukan apa yang disarankan Marcus dan melihat apakah saya bisa membuatnya berfungsi. Saya menghargai semua bantuan yang Anda berdua berikan kepada saya @pbsasdf - person fizzy; 26.04.2016