如何将嵌套 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
。建立从Car
到Driver
的反向to-one关系driver
。
现在您可以将汽车添加到 driver 赞
ferrari.driver = niki
编辑:我刚刚意识到你要求 swift,我不知道。那么我的回答不是真的有效,但我们只希望你能通读它:)反正逻辑是一样的,所以我不会删除它。
我会引用 Mundi 的回答,说一旦您使用核心数据模型构建了模型,您就应该使用自动生成的文件。这是非常简单和有效的。而且速度快。
要将 sub-object 添加到您的 object,您只需
- 获取或创建您的 object
- 创建 sub-objects
的新实例
- 将这些实例添加到您的 "containing" object。
保存 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 中写下将嵌套对象保存到核心数据时对我有用的内容。
- 创建您要保存到的父对象实体的 NSManagedObject 实例。
2.Create 个子对象的新实例
将实例作为键值对添加到包含对象中并保存上下文
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")
}
我有一对多 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
。建立从Car
到Driver
的反向to-one关系driver
。
现在您可以将汽车添加到 driver 赞
ferrari.driver = niki
编辑:我刚刚意识到你要求 swift,我不知道。那么我的回答不是真的有效,但我们只希望你能通读它:)反正逻辑是一样的,所以我不会删除它。
我会引用 Mundi 的回答,说一旦您使用核心数据模型构建了模型,您就应该使用自动生成的文件。这是非常简单和有效的。而且速度快。
要将 sub-object 添加到您的 object,您只需
- 获取或创建您的 object
- 创建 sub-objects 的新实例
- 将这些实例添加到您的 "containing" object。
保存
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 中写下将嵌套对象保存到核心数据时对我有用的内容。
- 创建您要保存到的父对象实体的 NSManagedObject 实例。
2.Create 个子对象的新实例
将实例作为键值对添加到包含对象中并保存上下文
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") }