2013-01-07 3 views
3

사용자가 나중에 선택하지 않는 한 객체를 저장하지 않으려는 목적으로 관리되는 객체 컨텍스트없이 NSManagedObject의 인스턴스를 만듭니다.NSManagedObject의 등록 정보가 null입니다.

컨텍스트가있는 엔터티 설명을 만든 다음 컨텍스트없이 개체 자체를 만드는 방법으로이 작업을 수행합니다. 아래에 그 예가 나와 있습니다.

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이다.

왜 이런 일이 발생하고 어떻게 속성을 저장할 수 있는지 아는 사람이 있습니까? 말했듯이, 물체가 존재합니다. 속성은 유지되지만 모든 속성은 null입니다.

나는 어떤 차이가 있다고 생각하지 않지만 엔티티를 생성, 저장 및 검색하려면 MagicalRecord을 사용합니다.

답변

3

하지 마십시오. 나는 :-)

전에이 같은 질문에 대답 한 당신은해야 하나 : 사용자가 누를 때

저장에 필요한 모든 값과 변수 후 작성 "저장"및 관리 개체를 삽입 및 컨텍스트를 저장합니다.

또는

개체를 생성하여 컨텍스트에 삽입하십시오. 객체에 대한 참조를 유지하고 사용자가 정보를 입력 할 때 객체를 업데이트합니다. 사용자가 저장을 누르면 컨텍스트를 저장합니다. 사용자가 취소를 누르면 객체를 삭제합니다.

컨텍스트에 삽입하지 않고 관리되는 개체를 만들어서는 안됩니다. 그것은 실제로 말이되지 않습니다.

회답도 참조하십시오. iPhone Core Data: Initializing Managed Object without a context

+1

당신 말이 맞습니다. 유일한 실제 해결책은 이렇게하지 않는 것입니다 :-) 이것은 Core Data가 사용되는 방식이 아니므로 예기치 않은 결과가 실제로 예상됩니다. – simonbs

+0

동의 함. 기본 NSConfinementConcurrencyType을 사용하는 하나의 컨텍스트가있는 응용 프로그램에서 nil 컨텍스트의 임시 객체를 사용하고 있지만 주 및 비공개 대기열을 사용하자마자 문제가 발생했습니다. – stevesliva

+0

또한 nil 속성은 컨텍스트없이 객체를 만들 때 건너 뛴 awakeFromInsert와 관련이있을 수 있습니다. – stevesliva