【问题标题】:Properties on NSManagedObject are nullNSManagedObject 上的属性为空
【发布时间】:2013-01-07 17:43:56
【问题描述】:

我在 nil 托管对象上下文中创建 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);
    }
}];

但是,当重新启动应用程序时,对象已添加到 Core Data,但对象上的所有属性都是null

有谁知道为什么会发生这种情况以及如何让它存储属性?如前所述,对象存在。它们是持久化的,但所有属性都是空的。

我认为这没有什么区别,但我使用MagicalRecord 来创建、保存和检索实体。

【问题讨论】:

    标签: ios ipad core-data magicalrecord


    【解决方案1】:

    不要这样做。我之前回答过同样的问题:-)

    您应该:

    保存所有必需的值和变量,然后当用户按下“保存”时创建并插入托管对象并保存上下文。

    或者:

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

    您不应该在未将托管对象插入上下文的情况下创建它。这真的没有意义。

    请参阅此答案iPhone Core Data: Initializing Managed Object without a context

    【讨论】:

    • 你是对的。唯一真正的解决方案是不要这样做 :-) 这不是 Core Data 应该被使用的方式,因此应该预料到意外的结果。
    • 同意。虽然我在一个使用默认 NSConfinementConcurrencyType 的具有一个上下文的应用程序中工作在一个 nil 上下文中的临时对象,但一旦我开始使用主队列和私有队列,事情就崩溃了。
    • 此外,nil 属性可能与 awakeFromInsert 相关,因为您在没有上下文的情况下创建的对象会被跳过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多