核心数据一对多和反向关系问题

时间:2009-09-16 19:29:43

标签: iphone core-data

我正在尝试将一组数据导入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

1 个答案:

答案 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];