2013-01-07 25 views
3

我在nil托管对象上下文中创建NSManagedObject的实例,因为我不想保存对象,除非用户稍后选择。NSManagedObject上的属性为空

我这样做是通过创建具有上下文的实体描述,然后在没有上下文的情况下创建对象本身。如下所示。

NZVideo *video = nil; 
if ([[tempVideo objectForKey:_kResponseVideoTypeKey] isEqualToString:_kVideoTypeYouTube] == YES) 
{ 
    NSEntityDescription *entityDescription = [NZYouTubeVideo entityDescriptionInContext:[NSManagedObjectContext contextForCurrentThread]]; 
    video = (NZVideo *)[[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil]; 
    [(NZYouTubeVideo *)video setVideoId:[media objectForKey:_kResponseVideoIdKey]]; 
} 
else if ([[tempVideo objectForKey:_kResponseVideoTypeKey] isEqualToString:_kVideoTypeS3] == YES) 
{ 
    NSEntityDescription *entityDescription = [NZS3Video entityDescriptionInContext:[NSManagedObjectContext contextForCurrentThread]]; 
    video = (NZVideo *)[[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil]; 
    [(NZS3Video *)video setAbsoluteVideoUrl:[media objectForKey:_kResponseVideoUrlKey]]; 
} 

[video setTitle:title]; 
[video setSummary:summary]; 
[video setDurationValue:duration]; 

if (tempThumbnails != nil) 
{ 
    NSString *smallThumbnail = [tempThumbnails objectForKey:_kResponseVideoThumbnailSmallKey]; 

    if (smallThumbnail != nil) 
    { 
     NSEntityDescription *entityDescription = [NZThumbnail entityDescriptionInContext:[NSManagedObjectContext contextForCurrentThread]]; 
     NZThumbnail *thumbnail = (NZThumbnail *)[[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil]; 
     [thumbnail setAbsoluteImageUrl:smallThumbnail]; 
     [thumbnail setAbsoluteSizeValue:NZThumbnailSizeSmall]; 
     [video addThumbnailsObject:thumbnail]; 
    } 
} 

if (video != nil) 
{ 
    [videos addObject:video]; 
} 

然后,当我想保存对象时,我将它们添加到托管对象上下文中。我还添加了该对象与之有关系的所有对象。

[MagicalRecord saveUsingCurrentThreadContextWithBlock:^(NSManagedObjectContext *context) { 
    id _video = nil; 
    if ([video isKindOfClass:[NZYouTubeVideo class]]) 
    { 
     _video = (NZYouTubeVideo *)video; 
    } 
    else if ([video isKindOfClass:[NZS3Video class]]) 
    { 
     _video = (NZS3Video *)video; 
    } 

    if (((NSManagedObject *)_video).managedObjectContext == nil) 
    { 
     [context insertObject:_video]; 
    } 

    for (NZThumbnail *thumbnail in ((NZVideo *)_video).thumbnails) 
    { 
     [context insertObject:thumbnail]; 
    } 

    [playlist addVideosObject:video]; 
} 
completion:^(BOOL success, NSError *error) { 
    if (error != nil) 
    { 
     DDLogVerbose(@"%@", error); 
    } 
}]; 

然而,在重新启动应用程序时,该物体已经被添加到核心数据,但所有的对象的属性是null

有谁知道为什么会发生这种情况,以及如何让它存储属性?如上所述,物体存在。他们被坚持,但所有的属性都是空的。

我不认为它有任何区别,但我使用MagicalRecord来创建,保存和检索实体。

回答

3

不要这样做。我以前:-)

已经回答了这个同样的问题,您应该:

保存所有所需的值和变量,然后当用户按下“保存”创建并插入管理对象和保存环境。

或者:

创建和插入对象插入上下文。保持对该对象的引用并在用户输入信息时更新它们。如果用户按下保存然后保存上下文。如果用户按取消,则只需删除该对象。

如果不将其插入到上下文中,则不应创建管理对象。它没有任何意义。

看到这个答案也iPhone Core Data: Initializing Managed Object without a context

+1

你说得对。唯一真正的解决方案是不这样做:-)这不是如何使用核心数据,因此应该预料到意想不到的结果。 – simonbs

+0

同意。尽管我使用默认的NSConfinementConcurrencyType在临时对象中使用默认的NSConfinementConcurrencyType处理应用程序中的临时对象,但一旦我开始使用主队列和专用队列,事情就会崩溃。 – stevesliva

+0

此外,nil属性可能与awakeFromInsert跳过您创建的不包含上下文的对象有关。 – stevesliva