Базовые данные One-To-Many Swift

Вопрос, который у меня есть, касается Core Data one-to-many relationship. На данный момент у меня есть приложение, позволяющее пользователю вводить информацию о сотрудниках и сохранять ее в core data, а затем обновлять табличное представление employee. Проблема, с которой я сталкиваюсь, - это отношения между employee и доставкой. В настоящее время я пытаюсь отобразить поставки конкретных сотрудников при нажатии на employee в табличном представлении employee. После выбора сотрудника из представления таблицы сотрудников я хочу, чтобы он перешел к другому представлению таблицы и отображал доставки сотрудников в другом 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 и как мне получить поставки сотрудника. настройка контроллера доставки TableView

На этой последней фотографии мой вопрос: как добавить эту запись о доставке выбранному сотруднику? вот как я сейчас сохраняю свои записи о доставке как я сохраняю свои записи о доставке

Если вы зашли так далеко, я ценю, что вы просматриваете мою проблему. Если кто-нибудь может хоть немного помочь мне с этой проблемой, я был бы признателен, если вы считаете, что я упустил некоторую информацию, которая необходима, пожалуйста, дайте мне знать.

ОБНОВИТЬ:

Вот изображение DelieveryTableViewController (да, я знаю, что неправильно написала доставку)

Изображение DelieveryTableViewController с viewDidLoad()

также необходимо установить NSPredicate

Изображение функции fetchRequest DeliveryTableViewController

это дом, я готовлюсь к переходу в EmployeeTableViewController

введите здесь описание изображения

это мои переменные для EmployeeTableViewController

введите здесь описание изображения


person fizzy    schedule 23.04.2016    source источник
comment
Что именно у вас не работает? Я вижу, что вы написали свое расширение «Доставка» вместо «Доставка», и это верно для нескольких других вещей, таких как идентификатор перехода и ваш «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. Если это nil, есть проблема с передачей значения в 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
let description = NSEntityDescription.entityForName(Delivery, inManagedObjectContext: manageObjectContext) var delivery = Delievery(entity: (description)!, insertIntoManagedObjectContext: manageObjectContext) let employeeDescription = NSEntityDescription.entityForName(Employee, inManagedObjectContext: manageObjectContext) let thisEmployee = Employee(entity: ( employeeDescription)!, insertIntoManagedObjectContext: manageObjectContext) delivery = thisEmployee.delievery?.allObjects - person fizzy; 24.04.2016
comment
Вам просто нужно правильно привести массив: deliveries = employee.delivery.allObjects() as! [NSManagedObject] - person pbasdf; 24.04.2016
comment
хорошо, большое спасибо, извините, я новичок в iOS и Swift, и так как у меня есть переменная с именем работник: 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
это не работает, потому что я отправляю из EmployeeTableViewController NSManagedObject. Когда я использую его в prepareForeSegue в EmployeeTableViewController в качестве сотрудника, например, employeeDeliveries.employee = selectedEmployee as! Сотрудник выдает мне фатальную ошибку: неожиданно найдено nil при распаковке необязательного значения при выполнении кода deliverys = employee.deliveries?.allObjects as! [NSManagedObject]... Прошу прощения за то, что сделал это настолько сложным. Базовые данные — чрезвычайно сложная для меня концепция. - 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, я только что вернулся к вашему вопросу. Я вижу, вы подняли еще один вопрос, непосредственно относящийся к неожиданно найденному nil; Мне нечего добавить к ответу и комментариям Маркуса. - person pbasdf; 26.04.2016
comment
Я делаю то, что предложил Маркус, и посмотрю, смогу ли я заставить это работать, я ценю всю помощь, которую вы оба мне оказали @pbsasdf - person fizzy; 26.04.2016