核心数据。如何使用在 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 子类中创建的方法的主要内容,如果未能解决你的问题,请参考以下文章

@dynamic 使用的常见情况是啥?

如何在我的 swift 框架中使用核心数据

如何使用核心数据离线显示 Json 数据

如何在核心数据中实现它

如何使用 swift 3 在核心数据中搜索字符串?

我们如何检索在 iOS 中使用核心数据保存的数据