通过关系调用核心数据属性

Calling a Core Data attribute through a relationship

我有两个 Entities,如下图所示:

FoodRestaurant

我知道现在的命名有点不对,但基本上,我正在建立一份食品清单。用户将添加一个包含食物名称和餐厅名称的新条目。我正处于发展的早期阶段。

所以在 AddViewController 和保存方法中,我有:

if let appDelegate = (UIApplication.shared.delegate as? AppDelegate) {
            foodEntry = FoodManagedObject(context: appDelegate.persistentContainer.viewContext)
            foodEntry.nameOfFood = foodNameTextField.text
            foodEntry.restaurantName?.nameOfRestaurant = restaurantNameTextField.text

声明了一个变量:

var foodEntry:FoodManagedObject!

TimelineView 中,使用 NSFetchedResultsController,我正在获取 FoodManagedObject 并且能够在标签中显示食物名称。但是,不会显示餐厅的名称。

所以,我正在适当地获取:

let fetchRequest: NSFetchRequest<FoodManagedObject> = FoodManagedObject.fetchRequest()
        let sortDescriptor = NSSortDescriptor(key: "nameOfFood", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]

        if let appDelegate = (UIApplication.shared.delegate as? AppDelegate) {
            let context = appDelegate.persistentContainer.viewContext
            fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
            fetchedResultsController.delegate = self

            do {
                try fetchedResultsController.performFetch()
                if let fetchedObjects = fetchedResultsController.fetchedObjects {
                    foods = fetchedObjects
                }
            } catch {
                print(error)
            }
        }

并在 cellForRow 中:

cell.foodNameLabel.text = foods[indexPath.row].nameOfFood

cell.restaurantLabel.text = foods[indexPath.row].restaurantName?.nameOfRestaurant

我没有收到任何错误,但餐厅的名称从未显示。

食物是:

var foods:[FoodManagedObject] = []

所以我尝试将一个名为 theRestaurant 的属性添加到食品实体中,这很有效,但通过关系调用似乎永远不会奏效。

我是不是漏掉了什么明显的东西?

您是在对象之间创建关系,而不是它们的值 这意味着,当您保存新的食物对象时,您必须分配已经存在的餐厅实体对象或创建新的。 您不能在没有初始化 restaurant 对象的情况下只分配对象值。

例如

foodEntry = FoodManagedObject(context: appDelegate.persistentContainer.viewContext)
foodEntry.nameOfFood = foodNameTextField.text

// Here you must to load existing Restaurant entity object from database or create the new one        
let restaurant = RestaurantManagedObject(context: appDelegate.persistentContainer.viewContext)
restaurant.nameOfRestaurant = restaurantNameTextField.text

foodEntry.restaurantName = restaurant // Object instead of value

或者,如果您已经有一些餐馆列表,则只需将新的食物对象添加到其中一个