通过关系调用核心数据属性
Calling a Core Data attribute through a relationship
我有两个 Entities
,如下图所示:
Food
和 Restaurant
。
我知道现在的命名有点不对,但基本上,我正在建立一份食品清单。用户将添加一个包含食物名称和餐厅名称的新条目。我正处于发展的早期阶段。
所以在 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
或者,如果您已经有一些餐馆列表,则只需将新的食物对象添加到其中一个
我有两个 Entities
,如下图所示:
Food
和 Restaurant
。
我知道现在的命名有点不对,但基本上,我正在建立一份食品清单。用户将添加一个包含食物名称和餐厅名称的新条目。我正处于发展的早期阶段。
所以在 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
或者,如果您已经有一些餐馆列表,则只需将新的食物对象添加到其中一个