3

ユーザーが後で選択しない限り、オブジェクトを保存したくないので、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.

なぜこれが起こるのか、どうすればプロパティを保存できるのか知っている人はいますか? 前述のとおり、オブジェクトは存在します。それらは永続化されますが、すべてのプロパティは null です。

違いはないと思いますが、エンティティの作成、保存、取得にはMagicalRecordを使用しています。

4

1 に答える 1

3

これをしないでください。私は以前にこの同じ質問に答えました:-)

次のいずれかを行う必要があります。

必要なすべての値と変数を保存し、ユーザーが「保存」を押したときに、管理対象オブジェクトを作成して挿入し、コンテキストを保存します。

または:

オブジェクトを作成してコンテキストに挿入します。オブジェクトへの参照を保持し、ユーザーが情報を入力するとそれらを更新します。ユーザーが保存を押した場合は、コンテキストを保存します。ユーザーがキャンセルを押した場合は、オブジェクトを削除するだけです。

コンテキストに挿入せずに管理対象オブジェクトを作成するべきではありません。本当に意味がありません。

この回答も参照してくださいiPhone Core Data: Initializing Managed Object without a context

于 2013-01-07T21:13:46.730 に答える