嗨其他开发者,
我的应用程序处于早期阶段,利用Core Data。
前提很简单:添加到餐馆,将其保存到Core Data并显示它。所以我有AddEntry
一堆textFields
- 用户填写了这些内容,点击Save
并将其保存到Core Data。在主视图中,使用NSFetchedResultsController
和UITableViewController
显示数据。这很好用。
我有一个DetailView
,看起来与AddEntry
完全相同,并且与Timeline
相距很远;单击一个单元格,它将显示DetailView
,显示填充的所有信息。
我尝试在此处编辑条目,例如,更改食物名称或餐馆(textFields
)并将其保存到Core Data。保存工作,但我已经意识到它实际上并没有覆盖条目,它只是创建一个全新的条目。
我完全理解为什么要这样做 - 我正在创建一个新实例等,但我并不是百分之百确定要做什么。
在以前的应用中,我使用了一种技术:
该代码(用目标C编写)如下:
人*人=零;
// Creating a fetch request to check whether the person already exists, calling from the Add/DetailViewController.
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
request.predicate = [NSPredicate predicateWithFormat:@"name = %@", name];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *people = [context executeFetchRequest:request error:&error];
if (!people)
{
// Handle Error
}
else if (![people count])
{
// If the person count is 0 then create it
person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
person.name = name;
}
else
{
// If the object exists, just return it
person = [people lastObject];
}
return person;
我现在正在Swift中使用这个新应用程序,我想知道:
insertNewObjectForEntityForName
"作为我的新Swift代码的一部分 - 我错过了吗?我的"保存"码。
if let appDelegate = (UIApplication.shared.delegate as? AppDelegate) {
// I am creating an instance of both the food and restaurant from the Food and Restaurant Managed Objects.
foodEntry = FoodManagedObject(context: appDelegate.persistentContainer.viewContext)
restaurantEntry = RestaurantsManagedObject(context: appDelegate.persistentContainer.viewContext)
foodEntry.nameOfFood = foodTextField.text
appDelegate.saveContext()
print("the food name is \(String(describing: foodEntry.nameOfFood))")
}
欢迎任何想法。
更新
答案提供了我需要的信息,但是为了我自己的理解,我需要找出一些东西,看看我是否能理解它是怎么回事。
在提供的视频和其他解决方案中,向CoreData添加新条目时,会提供代码insertNewObject(forEntity: "Entity" into: managedObjectContext)
。
在我的应用程序中,下面的代码完成了在CoreData中创建新条目的工作(我可以看到,因为NSFetchedResultsController
提供了结果)。为什么我的代码有效,我的代码实际上与insertNewObject(forEntity: "Entity" into: managedObjectContext)
的做法有何不同?我实际上应该使用insertNewObject(forEntity: "Entity" into: managedObjectContext)?
if let appDelegate = (UIApplication.shared.delegate as? AppDelegate) {
// I am creating an instance of both the food and restaurant from the Food and Restaurant Managed Objects.
foodEntry = FoodManagedObject(context: appDelegate.persistentContainer.viewContext)
restaurantEntry = RestaurantsManagedObject(context: appDelegate.persistentContainer.viewContext)
// I am firstly setting the name to the nameTextField. That's easy.
foodEntry.nameOfFood = foodNameTextField.text
foodEntry.type = restaurantTypeTextField.text
// I am then setting the restaurant Name using the restaurnt Managed Object and then assigning the foodEntry.restaurant (the relationship) to the entry. This is a trick from Envylope and is what got the restaurantName to display on the Timeline. The same is done for the address.
restaurantEntry.nameOfRestaurant = restaurantNameTextField.text
restaurantEntry.address = restaurantLocationTextField.text
foodEntry.restaurant = restaurantEntry