核心数据NSString工作NSNumber不

时间:2015-06-22 18:08:05

标签: ios objective-c core-data

我正在使用Objective-C在iOS上开发应用程序。
我正在尝试使用Core Data,但我遇到了一个非常奇怪的问题。

@interface Food : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * bought;
@property (nonatomic, retain) NSNumber * quantity;

@end

/

- (void)viewDidLoad {
[super viewDidLoad];
Food* newFood = (Food*)[NSEntityDescription entityForName:@"Food"
                                   inManagedObjectContext:self.managedObjectContext];
NSLog(@"%@", newFood.name);
NSLog(@"%d", [newFood.quantity intValue]);

这将打印出名称,但会在数量上给出错误 我尝试了很多不同的东西,我不知道问题是什么 我没有更改数据模型或在字符串和数字之间做任何不同的事情 我甚至在一个新项目和同样的事情中重新制作了一切。

这是错误:

2015-06-22 13:05:22.219 Test[50408:2682580] Food
2015-06-22 13:05:22.219 Test[50408:2682580] -[NSEntityDescription         quantity]: unrecognized selector sent to instance 0x7fdb7ae24a60
2015-06-22 13:05:22.221 Test[50408:2682580] *** Terminating app     due to uncaught exception 'NSInvalidArgumentException', reason: '-    [NSEntityDescription quantity]: unrecognized selector sent to instance 0x7fdb7ae24a60'

2 个答案:

答案 0 :(得分:1)

您正在创建一个NSEntityDescription实例,它只描述(因此名称)一个实体。但是不是使用它,而是粗暴地将它强制转换为所需的类,但是转换只会告诉编译器关闭,它不会神奇地将某些内容转换为其他内容。

NSEntityDescription碰巧有一个name属性,这就是该行有效的原因。

尝试

Food *newFood = [NSEntityDescription insertNewObjectForEntityForName:@"Food" 
                                              inManagedObjectContext:self.managedObjectContext];

来自Core Data Programming Guide

  •   

    实体描述

         

    实体描述指定(除其他外)实体的名称,用于表示实体的类   实体和实体的属性。实体描述是   很重要,因为给定的类可能用于表示多个   entity-默认情况下,所有实体都由NSManagedObject表示。   核心数据使用实体描述来确定属性a   托管对象具有,需要保存或从中检索的内容   持久性存储,以及对属性值的约束。   实体描述是托管对象模型的属性。

  •   

    创建受管对象

         

    从根本上说,NSManagedObject是一个与任何其他类似的Objective-C类   Objective-C类。像其他各种类一样,NSManagedObject强加   实例创建的一些约束。如前所述,你必须   将新的托管对象实例与实体对象相关联   定义其属性以及托管对象上下文   定义其环境。因此,您无法初始化托管   对象只需发送一条init消息,就必须使用指定的   初始化程序 - initWithEntity:insertIntoManagedObjectContext: - 设置   实体和背景:

    NSManagedObject *newEmployee = [[NSManagedObject alloc] initWithEntity:employeeEntity
                                             insertIntoManagedObjectContext:context];
    

更多观察结果:

  • 现在我希望Objective-C / Cocoa(-touch)代码使用自动引用计数,因为属性的retain属性应该与strong交换

  • 对于NSString属性,您几乎肯定需要copy而不是strong

  •   

    使用insertNewObject时会自动保存吗?

不,因为这可能会导致商店中没有完全填充的对象,具体取决于您的型号和尺寸。应用逻辑。

  •   

    还是必须从委托中调用saveContext?

保存的位置和时间取决于您的应用逻辑。

答案 1 :(得分:1)

您没有获得NSManagedObject子类Food,而是获得了NSEntityDescription

您不希望entityForName:inManagedObjectContext:想要insertNewObjectForEntityForName:inManagedObjectContext:

您的奇怪调试信息的说明:

name属性的工作原因是因为它是NSEntityDescription的属性。将您的Food媒体资源更改为foodName并观看会发生什么。 name电话仍然有效。