【问题标题】:How to add nested object to exising object in core data如何将嵌套对象添加到核心数据中的现有对象
【发布时间】:2015-04-15 08:45:55
【问题描述】:

我有一对多对象Driver <-->> Car
类:

class Driver: NSManagedObject {
   @NSManaged var fullName: String
    @NSManaged var cars: NSSet
}
class Car: NSManagedObject {
   @NSManaged var model: String
   @NSManaged var year: String
   @NSManaged var driver: Driver
}

我插入了一个 Driver 和一些汽车对象。
但我不知道更新汽车列表以添加或删除一些汽车对象的正确方法是什么。
有线但我在网上找不到任何示例如何做到这一点。
那么如何将新车添加到现有驱动程序或从中删除汽车?

更新 我尝试了类似的方法,但它将新车保存在数据库中,但这些新车与驾驶员无关。
当我在cars:NSSet 找司机时,我仍然得到一辆车。

let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext;

        var newCar:Car = NSEntityDescription.insertNewObjectForEntityForName("Car", inManagedObjectContext: context!) as! Car

        newCar.year = "1977";

        var cars = driver?.cars.allObjects as! [Car]

        cars.append(newCar)

        var err: NSError?;

        context?.save(&err);

【问题讨论】:

    标签: swift core-data ios8 nsmanagedobject nsmanagedobjectcontext


    【解决方案1】:

    编辑:我刚刚意识到你要求 swift,我不知道。那时我的回答并不是真的有效,但我们只是希望你能通读它:) 反正逻辑是一样的,所以我不会删除它。

    我将引用 Mundi 的回答,即在使用核心数据模型构建模型后,您应该使用自动生成的文件。这是非常简单和有效的。而且速度很快。

    要将子对象添加到您的对象,您只需

    1. 获取或创建您的对象
    2. 创建子对象的新实例
    3. 将这些实例添加到您的“包含”对象中。
    4. 保存managedObjectContext

      //A method that returns your object 
      -(Car*)getCarById:(NSString*)carId inContext:(NSManagedObjectContext*)context{
          NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Cars" inManagedObjectContext:context];
          NSFetchRequest *request = [[NSFetchRequest alloc] init];
          [request setEntity:entityDescription];
      
          //NSPredicate has to be used to fetch the correct car. I'll assume you know that.
      
          NSError *error;
          NSArray *array = [context executeFetchRequest:request error:&error];
          if (array.count > 0)
              return (array.firstObject);
      }
      

    如果此方法未返回您的 Car/Driver,请创建它。

    Car *car = [self getCarById:myId inManagedObjectContext:context];
        if(!car)
        {
            car = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:context];
        }
    

    您现在拥有自己的对象,如果有的话,所有这些都是子对象(即使是故障状态)。

    现在,如果我有一个 Driver 对象(我使用相同的方法获得),我可以简单地使用

    [car addDriver:driver];
    

    因为这个方法是在我创建模型时自动生成的。

    如果你自己有司机,你可以上去给他另一辆车

    driver.car = car;
    

    我还没有真正在这个方向上进行测试,但我认为你应该没问题,核心数据在涉及到这样简单的事情时非常强大。

    这对我来说也很模糊,addDriver:可能是 addObject 或 setDriver,也可能是 insertDriver。我不完全记得,但无论如何你应该能够在 .h 文件中找到它们。 :)

    【讨论】:

    • 由于某些原因,没有添加像 addDriver 这样的函数。我不知道为什么。但无论如何,获取驱动程序并将其添加到汽车对象就可以了。
    【解决方案2】:

    首先,Core Data 中的变量名称,按照惯例以小写字母开头。因此,fullName,而不是FullName

    其次,您不要自己编写此文件。相反,您使用模型编辑器并让 Xcode 生成类文件。

    在模型编辑器中,从指向Car 实体的Driver 实体建立一对多关系cars。建立从CarDriver 的反向一对一关系driver

    现在您可以将汽车添加到像这样的司机

    ferrari.driver = niki
    

    【讨论】:

    • 谢谢。我导出了它的对象,但我在这里手工写了它:-)。我知道如何插入它,但我不知道如何更新汽车年份或向驱动程序添加新车。我更新了有问题的代码。
    • car.year = "2011" ,创建汽车,添加驱动如上图。您应该将问题标记为已回答,因为您的原始问题已得到充分说明。
    【解决方案3】:

    根据@Gil Sand 的回答,在将嵌套对象保存到 coredata 时,让我快速编写对我有用的方法。

    1. 创建您想要保存到的父对象实体的 NSManagedObject 实例。

    2.创建子对象的新实例

    1. 将实例作为键值对添加到包含对象中并保存上下文

      for car in cars { 
       //Step 1
         let entity = NSEntityDescription.insertNewObject(forEntityName: "Car", into: managedObjectContext)
      
       // Step 2
         let driver_entity =  NSEntityDescription.entity(forEntityName: "Driver", in: managedObjectContext)
      
          let driver = Driver(entity: driver_entity, insertInto: managedObjectContext)
      
         driver.name = "Sean Paul"
         driver.age = "46"
      
       //Step 3
       entity.setValue(model, forKey: "model")
       entity.setValue(year, forKey: "year")
       entity.setValue(driver, forKey: "driver") // the key name "driver" is the entity relationship name you define in your coredata model
      
       managedObjectContext.insert(entity)
       }
      
      
            do {
                  try managedObjectContext.save()
            } catch {
                  print("Failed saving car details")
            }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多