【问题标题】:iOS Core Data executeFetchRequest is returning empty objectiOS 核心数据 executeFetchRequest 正在返回空对象
【发布时间】:2014-06-08 16:00:28
【问题描述】:

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

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.h:

Events.m:

【问题讨论】:

  • 检查objects中存储的对象类型。我的猜测是它们是Events 的实例。
  • error 是否已设置,还是仍为 nil?
  • 您可以尝试打印对象吗?您的对象有可能是错误的。
  • "one element that is nil" 没有任何意义,因为NSArray 不能包含 nil 值。你实际上得到了什么?
  • 好问题! [objects class] 的 NSLogging 给出“_PFArray”,错误给出“(null)”,而 objects 给出“ (entity: Events; id: ... , data: )” 奇怪的是其他属性未列出。是的,在调试器中我看到了“[0]”元素,但那里什么也没有。

标签: ios core-data nsdictionary


【解决方案1】:

我知道发生了什么:

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

[fetchRequest setReturnsObjectsAsFaults:NO];

注意 NSLogging 对象没有这个产生“数据:”。

第二,也是最重要的,“对象”不是 NSDictionarys 或 NSMutableDictionarys 的 NSArray。所以虽然我可以替换[objects objectAtIndex:0]" with "objects[0],但我不能用[objects[0][@"created"] 替换[objects[0] valueForKey:@"created"]。这就是导致崩溃的原因。

希望这对某人有所帮助!

【讨论】:

  • 包含崩溃报告会使这一点显而易见。你不需要告诉它不要返回错误,只需要你答案的第二部分。 objectsEvent 对象的数组。
  • 对。新手错误!
  • 比较常见的,别心疼:)
  • 什么?!我以前从来不需要这个(在以前的 Xcode 版本中)。哦,我真的很讨厌这种环境。感谢您的提示...难以置信。
  • 有趣的是,Apple 自己的示例并未提及此标志,因此它们还将向您展示如何编写代码以从 CoreData 加载空白记录。逆天。 developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
【解决方案2】:

请在访问@"data"之前调用 willAccessValueForKey:

[objects[0] willAccessValueForKey:@"data"];
NSMutableDictionary *data = objects[0][@"data"];
[objects[0] didAccessValueForKey:@"data"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多