核心数据。如何使用在 NSManagedObject 子类中创建的方法
Posted
技术标签:
【中文标题】核心数据。如何使用在 NSManagedObject 子类中创建的方法【英文标题】:Core Data. How to use method created in NSManagedObject subclass 【发布时间】:2011-08-22 07:10:19 【问题描述】:我的数据模型
我生成了 Pack 和 Class 的子类。在 Pack.m 中我可以看到以下内容
#import "Pack.h"
#import "Card.h"
@implementation Pack
@dynamic packTitle;
@dynamic card;
- (void)addCardObject:(Card *)value
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"card" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"card"] addObject:value];
[self didChangeValueForKey:@"card" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[changedObjects release];
- (void)removeCardObject:(Card *)value
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"card" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"card"] removeObject:value];
[self didChangeValueForKey:@"card" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[changedObjects release];
- (void)addCard:(NSSet *)value
[self willChangeValueForKey:@"card" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
[[self primitiveValueForKey:@"card"] unionSet:value];
[self didChangeValueForKey:@"card" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
- (void)removeCard:(NSSet *)value
[self willChangeValueForKey:@"card" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
[[self primitiveValueForKey:@"card"] minusSet:value];
[self didChangeValueForKey:@"card" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
@end
所有这些方法都是由 xcode 生成的,不是公开的。我试图让第一个成为公共方法 并在我的 viewController 中以这种方式写入数据库,其中 inputCardPack 是数组。
Pack* pack = [NSEntityDescription insertNewObjectForEntityForName:@"Pack" inManagedObjectContext:self.context];
pack.packTitle = self.inputCardPackTitle;
for (int i = 0; i< [self.inputCardPack count]; i++ )
NSNumber *level = [NSNumber numberWithInt:0];
Card *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:self.context];
card.term = [[self.inputCardPack objectAtIndex:i] objectAtIndex:0];
card.def = [[self.inputCardPack objectAtIndex:i] objectAtIndex:1];
card.level = level;
//I'm trying to add a card to pack
[pack addCardObject:card];
它不起作用,我在最后一行出现错误。如果我删除最后一行,它会起作用。 问题: 使用这些生成的方法是正确的方法吗? 如何获取属于已定义包的所有卡片?
【问题讨论】:
可以,推荐使用xcode生成的方法。你得到什么错误? 由于未捕获的异常 'NSInvalidArgumentException',我正在终止应用程序,原因:'-[NSManagedObject addCardObject:]: unrecognized selector sent to instance 0x4f42f60' 问题出在模型上。我之前删除了它,命名为ii,后记重命名。现在我刚刚制作了产品-> 清洁并且它有效!第二个问题仍然悬而未决。 【参考方案1】:您是否尝试过像这样实例化一个新的卡片对象?
NSEntityDescription * description = [NSEntityDescription
entityForName:@"Card" inManagedObjectContext:self.context];
Card *card = [[Card alloc]initWithEntity:description
insertIntoManagedObjectContext:self.context];
然后,一旦你有了那个临时卡对象,你就可以像这样设置它的值:
[card setValue: [[self.inputCardPack objectAtIndex:i] objectAtIndex:0]
forKey: "term"];
您可以确定其他方式,但由于那个讨厌的小@dynamic identifer,编译器会质疑您没有以“CoreData”规定的方式设置值。基本上,您正在尝试设置尚未为其分配空间的属性的值,因为您没有 @synthesize 并分配它。
我不是 100% 了解 clang(objective-c 编译器)的内部工作原理,所以如果有人发现我所说的有问题,请告诉我。这种方法似乎对我有用。
希望对你有帮助
【讨论】:
以上是关于核心数据。如何使用在 NSManagedObject 子类中创建的方法的主要内容,如果未能解决你的问题,请参考以下文章