NSManagedObject 故障/无法获得由 NSManagedObject 处理的“原始”对象

Posted

技术标签:

【中文标题】NSManagedObject 故障/无法获得由 NSManagedObject 处理的“原始”对象【英文标题】:NSManagedObject fault / cannot get 'primitive' object handled by NSManagedObject 【发布时间】:2013-12-21 17:39:47 【问题描述】:

我正在为 CoreData 苦苦挣扎。我想获取以下对象:

@interface Email : NSManagedObject 


@property (nonatomic, copy) NSString *email;
@property (nonatomic, copy) NSString *contact;
@end

..并将结果放在 NSMutableArray 中,但将 NSString 内容(不是 NSManagedObjects!)。这是因为我使用的是 json-framework 并且该引擎不允许传递 NSManagedObjects。

这些行 fetch perfom 从 CoreData 获取

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Emails" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"email"]];
    NSError *error = nil;
    NSMutableArray *fetchedObjects = [[NSMutableArray alloc] init];
    fetchedObjects= [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    flight.emails=fetchedObjects;

'flight' 对象声明如下:

@interface Flight : NSObject 
    NSMutableArray                  *_emails;


@property (nonatomic, retain)   NSMutableArray   *emails;

使用此代码,我遇到了 CoreData 错误。我尝试了一些其他的实现变体,但从未真正设法在 flight.emails 中有 NSString 对象,但总是 NSManagedObjects。我尝试的是在电子邮件 NSManagedObject 中实现一个专用的 getter 函数,该函数复制获取的 NSString 并返回副本。

我知道这是一个常见问题,但是,我的研究并没有在这里找到解决方案。

谢谢, 彼得

【问题讨论】:

【参考方案1】:

根据经验,setPropertiesToFetch: 仅在请求返回的对象为字典时才有效。所以你的代码中有几个问题:

    您正在请求特定属性(电子邮件),但尚未将返回类型设置为字典。看看setResultType:。 您仍然需要获取结果并从中提取电子邮件对象。您不能只将结果数组分配给您的 emails 属性。

试试这个:

[fetchedRequest setResultType:NSDictionaryResultType];
NSArray* results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

if(error != nil || results == nil) return;

flight.emails = [results valueForKeyPath:@"email"];

【讨论】:

备注:检查错误条件应始终通过检查返回值(在本例中为:if (results == nil) ...)而不是通过检查error 变量来完成。 (记录在这里:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…) 非常感谢,Leo Natan,您的回答成功了。

以上是关于NSManagedObject 故障/无法获得由 NSManagedObject 处理的“原始”对象的主要内容,如果未能解决你的问题,请参考以下文章

Swift:无法将“NSManagedObject”类型的值转换为“data Model.Entity”

核心数据:更新 NSManagedObject 并选择回退到原始状态

为啥我使用 NSManagedObject 在 self 上获得基于块的崩溃清除 KVO?

NSFetchedResultsController 由 NSManagedObject 的 refreshObject 触发。为啥?

您如何获得一个新的核心数据实体属性以反映在该实体的 NSManagedObject 中?

自定义 NSManagedObject 类从 NSOrderedSet 添加/删除对象