如何将嵌套 object 添加到核心数据中的现有 object

How to add nested object to exising object in core data

我有一对多 objectDriver <-->> 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和几辆objects。
但我不知道更新汽车列表以添加或删除一些汽车的正确方法是什么 object。
有线,但我在网上找不到任何示例如何执行此操作。
那么如何向现有 driver 添加新车或从中移除新车?

更新 我尝试过类似的方法,但它在数据库中保存了新车,但这些新车与 driver.
无关 当我在 cars:NSSet 取 driver 时,我仍然得到一辆车。

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);

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

第二,这个文件不是你自己写的。相反,您使用模型编辑器并让 Xcode 生成 class 文件。

在模型编辑器中,从指向 Car 实体的 Driver 实体建立 to-many 关系 cars。建立从CarDriver的反向to-one关系driver

现在您可以将汽车添加到 driver 赞

ferrari.driver = niki

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

我会引用 Mundi 的回答,说一旦您使用核心数据模型构建了模型,您就应该使用自动生成的文件。这是非常简单和有效的。而且速度快。

要将 sub-object 添加到您的 object,您只需

  1. 获取或创建您的 object
  2. 创建 sub-objects
  3. 的新实例
  4. 将这些实例添加到您的 "containing" object。
  5. 保存 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);
    }
    

如果此方法没有 return 您的 Car/Driver,请创建它。

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

您现在拥有 object(s),如果有的话,所有这些都是子 objects(即使处于故障状态)。

现在,如果我有 Driver object(我使用相同的方法得到),我可以简单地使用

[car addDriver:driver];

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

如果你自己有你的driver,你可以上去再给他一辆车

driver.car = car;

我没有真正测试过朝那个方向做的事情,但我认为你应该没问题,核心数据在处理这样简单的事情时非常强大。

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

根据@Gil Sand 的回答,让我在 swift 中写下将嵌套对象保存到核心数据时对我有用的内容。

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

2.Create 个子对象的新实例

  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")
          }