我正在使用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类。)
以下是我设置实体的方式:
Events.h:
Events.m:
答案 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"];