iOS Core Data executeFetchRequest返回空对象

时间:2014-04-23 16:56:33

标签: ios core-data nsdictionary

我正在使用Core Data来存储包含可转换NSDictionary属性的实体。我存储后可以在.SQLite文件中看到一个对象,所以我觉得(?)我很擅长。但是,当我尝试检索整个实体时,我得到一个NSArray,其中一个元素[0]为零,当然,当我尝试访问任何属性时(当然)崩溃。

HVBAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];

NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Events" inManagedObjectContext:context];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entityDesc];

NSError *error;
NSArray *objects = [context executeFetchRequest:fetchRequest error:&error];

// [objects count] = 1 but objects[0] = nil

// and the following line crashes of course
NSMutableDictionary *data = objects[0][@"data"];

知道我做错了什么吗?谢谢!

(请注意,我已经设置了一个带有NSDictionary属性和其他属性的Events类。)

以下是我设置实体的方式:

enter image description here

Events.h:

enter image description here

Events.m:

enter image description here

2 个答案:

答案 0 :(得分:8)

我弄清楚发生了什么:

首先,'对象'有一行但显得“空”的原因是因为这是默认行为。除非您通过发送setReturnsObjectsAsFaults消息进行更改,否则在您明确要求之前不会检索值:

[fetchRequest setReturnsObjectsAsFaults:NO];

请注意,NSLogging没有这个的对象产生了“data:”。

其次,最重要的是,'对象'不是NSDictionarys或NSMutableDictionarys的NSArray。因此,虽然我可以替换[objects objectAtIndex:0]" with "objects[0],但我无法将[objects[0] valueForKey:@"created"]替换为[objects[0][@"created"]。这就是导致崩溃的原因。

希望这有助于某人!

答案 1 :(得分:0)

请在访问@"数据"

之前致电willAccessValueForKey:
[objects[0] willAccessValueForKey:@"data"];
NSMutableDictionary *data = objects[0][@"data"];
[objects[0] didAccessValueForKey:@"data"];