更新现有核心数据条目

时间:2017-05-09 08:53:44

标签: ios swift core-data nsfetchedresultscontroller

嗨其他开发者,

我的应用程序处于早期阶段,利用Core Data。

前提很简单:添加到餐馆,将其保存到Core Data并显示它。所以我有AddEntry一堆textFields - 用户填写了这些内容,点击Save并将其保存到Core Data。在主视图中,使用NSFetchedResultsControllerUITableViewController显示数据。这很好用。

我有一个DetailView,看起来与AddEntry完全相同,并且与Timeline相距很远;单击一个单元格,它将显示DetailView,显示填充的所有信息。

我尝试在此处编辑条目,例如,更改食物名称或餐馆(textFields)并将其保存到Core Data。保存工作,但我已经意识到它实际上并没有覆盖条目,它只是创建一个全新的条目。

我完全理解为什么要这样做 - 我正在创建一个新实例等,但我并不是百分之百确定要做什么。

在以前的应用中,我使用了一种技术:

  • 执行获取请求
  • 创建一个fetchRequets数组
  • 如果条目不存在,请创建
  • 如果确实如此,请将其退回。

该代码(用目标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

0 个答案:

没有答案