我正在尝试将一组数据导入CoreData persistentStore。这是将在运行时呈现给用户的只读数据。
我有一个名为“类别”的实体,它与一个名为“Item”的实体有一对多的关系,而该实体又与一个类别有反向关系。
当我向上下文添加项目时,如何将它们与正确的类别相关联?我可以在SQLite dB中看到它是通过向Item表添加Category字段来完成的,并且可能使用Categories主键进行关系。但PK是幕后的...有没有一种方法来建立连接?
我在我的Category类中也看到CoreData生成的方法用于添加Items,但我假设这些是允许CoreData维护关系的现场方法:
@interface Category (CoreDataGeneratedAccessors)
- (void)addItemObject:(Item *)value;
- (void)removeItemObject:(Item *)value;
- (void)addItems:(NSSet *)value;
- (void)removeItems:(NSSet *)value;
@end
我在编程指南中读到CoreData会自动处理关系的另一面,但我无法弄清楚在添加Items时如何进行类别的初始链接。
由于
JK
答案 0 :(得分:9)
有不同的可能性。如果您已经有一个Category对象(例如通过获取请求获得),并假设变量
Category *category;
Item *item;
然后您只需执行以下操作:
item.category = category;
或
[category setValue: category forKey:@"category"];
并且您已完成,因为Core Data会自动设置反向关系。
如果您没有Category对象,或者想要插入新对象,请执行以下操作:
// Create a new instance of the entity
Category *category = (Category *) [NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:managedObjectContext];
// add all of the category properties, then set the relationship
// for instance set the category name
[category setValue:@"myCategoryName" forKey:@"name"];
[category setValue:item forKey:@"item"];
然后,像以前一样为Item对象设置此Category对象。 最后,您显示的方法不会在Core Data的幕后使用:您可以使用这些方法,以便您也可以执行以下操作:
[category addItemObject:item];
或反过来:
[item addCategoryObject:category];