我有两个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
的属性添加到食物实体中并且有效,但通过关系进行调用似乎无法正常工作。
我错过了一些明显的东西吗?
答案 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
或者,如果您已经有一些餐馆列表,而不仅仅是将新的食物对象添加到其中一个