核心生成的访问器未正确生成

时间:2013-11-01 19:06:29

标签: ios core-data accessor

我在尝试使用核心数据运行此应用时遇到错误。 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'to-many关系的值不可接受的类型:property =“ingredient”;期望的类型= NSSet;给定类型=成分;

我看到核心生成的访问器addIngredient:和removeIngredient:都将NSSet作为参数,所以我尝试将其更改为Ingredient,但这没有帮助。我怀疑虽然我更改了标题中的参数,但是在实现中有一些我看不到的东西?建议?

Recipe.h

@class IngredientList;

@interface Recipe : NSManagedObject

@property (nonatomic, retain) NSString * recipeName;
@property (nonatomic, retain) IngredientList *ingredientList;

@end

IngredientList.h

@class Ingredient, Recipe;

@interface IngredientList : NSManagedObject

@property (nonatomic, retain) Recipe *recipe;
@property (nonatomic, retain) NSSet *ingredient;
@end

@interface IngredientList (CoreDataGeneratedAccessors)

- (void)addIngredientObject:(Ingredient *)value;
- (void)removeIngredientObject:(Ingredient *)value;
- (void)addIngredient:(NSSet *)values;
- (void)removeIngredient:(NSSet *)values;

@end

Ingredient.h

@class IngredientList;

@interface Ingredient : NSManagedObject

@property (nonatomic, retain) NSString * ingredientName;
@property (nonatomic, retain) IngredientList *ingredientList;

@end

1 个答案:

答案 0 :(得分:0)

如果我看到正确,那么ingredient就是来自IngredientList的多对多关系 到Ingredient。 (备注:更好的名称是复数形式ingredients。)

然后addIngredientObject:,而不是addIngredient:是添加成分的方法 到列表:

IngredientList *aList = ...;
Ingredient *anIngredient = ...;
[aList addIngredientObject:anIngredient];

或者,您可以设置反比关系:

anIngredient.ingredientList = aList;

方法addIngredient:NSSet为参数,用于添加 一步到位的一整套对象。

核心数据访问器方法是在运行时动态生成的, 因此,您不能只更改生成的.h或.m文件。 如果模型已更改,您应该始终让Xcode重新生成文件。