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

时间:2013-12-21 17:39:48

标签: ios nsmanagedobject

我正在努力使用CoreData。我想获取以下对象:

@interface Email : NSManagedObject {
}

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

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

这些行获取来自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。我尝试的是在Email NSManagedObject中实现专用的getter函数,该函数复制获取的NSString并返回副本。

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

谢谢, 彼得

1 个答案:

答案 0 :(得分:1)

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

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

    [fetchedRequest setResultType:NSDictionaryResultType];
    NSArray* results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    
    if(error != nil || results == nil) return;
    
    flight.emails = [results valueForKeyPath:@"email"];