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

时间:2015-04-15 08:45:55

标签: swift core-data ios8 nsmanagedobject nsmanagedobjectcontext

我有一对多对象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
}

我插入了一个驱动程序和一些汽车对象 但我不知道更新车辆列表以添加或删除某些车辆对象的正确方法是什么 有线,但我在网上找不到任何例子如何做到这一点 那么如何将新车添加到现有的驾驶员或从中取出车呢?
更新 我尝试过类似的东西,但它将新车保存在数据库中,但这些新车与驾驶员无关 当我在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);

3 个答案:

答案 0 :(得分:1)

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

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

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

现在您可以将汽车添加到像

这样的驱动程序中
ferrari.driver = niki

答案 1 :(得分:1)

编辑:我刚刚意识到你要求快速,我不知道。我的答案不是真的有效,但我们只希望你能读完它:)不管怎样,逻辑是一样的,所以我不会删除它。

我引用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);
    }
    
  5. 如果此方法未返回您的汽车/司机,请创建它。

    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文件中找到它们。 :)

答案 2 :(得分:0)

基于@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")
          }