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 触发。为啥?