通过关系调用Core Data属性

时间:2017-05-04 06:17:15

标签: swift uitableview core-data attributes nsfetchedresultscontroller

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

enter image description here

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的属性添加到食物实体中并且有效,但通过关系进行调用似乎无法正常工作。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:0)

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

E.g。

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

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