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

问题描述 投票:0回答:3

我有一对多的对象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);
swift core-data ios8 nsmanagedobject nsmanagedobjectcontext
3个回答
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);
    }
    

如果此方法未返回您的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文件中找到它们。 :)


1
投票

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

第二,您不能自己编写此文件。相反,您可以使用模型编辑器并让Xcode生成类文件。

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

现在您可以像这样向驾驶员添加汽车

ferrari.driver = niki

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")
          }
    
© www.soinside.com 2019 - 2024. All rights reserved.