2011-09-01 2 views
1

NSData를 사용하여 코어 데이터에 배열을 저장하려고하는데 ManagedObjectContext에 0 개의 개체가 있으며 호출 할 때 NULL로 표시됩니다. 엔티티가 Event라는 3 개의 속성 (chatArray, ..., ...)이 있습니다. 나는 11 시간 동안 노력했지만 알아낼 수는 없다. 나는 NSData가 정확하기 때문에 내가 잘못 설정하고 있다고 생각한다. 나는 이것을 어떻게 세워야 하나?핵심 데이터 관리되는 개체 컨텍스트 저장 문제

내가 채팅 응용 프로그램을 개발하고 있는데 테이블보기에서 채팅 메시지가

UPDATE (이 데이터의 배열입니다). 앱을 종료하고 다시로드하면 채팅 기록을 모두 저장해야합니다. 내가 문자열로 들어오는 메시지를 테이블 배열에 추가했습니다. 배열을 만들지 않고 핵심 데이터에 텍스트 문자열로 메시지를 추가하면 응용 프로그램을 다시로드 할 때 테이블보기의 배열에 어떻게 추가 할 수 있습니까?

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain) NSManagedObject *managedObject; 

//

NSArray *array = [[[NSArray alloc]initWithObjects:@"one",@"two",@"three", nil]autorelease]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 
NSLog(@"data %@",data); 

NSLog(@"Array %@",[NSKeyedUnarchiver unarchiveObjectWithData:data]); 

[(Event*)managedObject setValue:data forKey:@"chatArray"]; 

if ([self managedObject]) 
{ 
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]]; 
    [(Event *)managedObject setChatArray:data];    } 
else { 
    Event *event = [[[Event alloc] initInsertingIntoManagedObjectContext:managedObjectContext]autorelease]; 
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]]; 
    [event setChatArray:data]; 
} 

NSError *error; 
[managedObjectContext save:&error]; 

NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:[(Event*)managedObject valueForKey:@"chatArray"]]; 

NSLog(@"chatArray %@",myArray); 
+0

나는 여기서 무슨 일이 일어나는지 정말로 말할 수 없다. managedObject 및 [self managedObject]가 있습니다. 그것들이 똑같다고 가정 할 때 나는 맞습니까? 하지만 확인하기 전에 메시지를 보내십시오. 그러면 어떻게됩니까? nil이 아니라면 모델에 삽입되는 코드가 실행되지 않습니다. 따라서 이전에 managedObject를 모델에 삽입했는지 여부는 알 수 없습니다. 두 경우 모두 가져 오기 요청을 만들지 만 실행하지 마십시오. 어떤 코드 경로를 사용하고 있습니까? 컨텍스트를 저장 한 후에 오류 값을 확인 했습니까? – morningstar

+0

두 번째 걸립니다. 그리고 그것은 아무런 오류도 없다. Nill은 ... –

답변

1

브랜든,

첫째, 코어 데이터에 BLOB를은 (리프 노드에 저장해야 즉, 단지 BLOB 한 관계에 다시 포함 된 엔티티 (이 패턴/관례는 엔터티에 다른 관계가있을 때 큰 얼룩의주기를 유지하는 것이 거의 자명하지 않기 때문에 나타났습니다.)

둘째, 왜 저장하고 있습니까? 이러한 문자열은 배열로, 타임 스탬프가있는 엔티티가 아닙니다. BLOB는 개별 행보다 특별히 효율적이지 않으며 시스템은 메시지를 검색하고 더 유연하게 행을 저장할 수 있습니다. SQLite는 문자열을 특별히 처리합니다.

셋째, 모델 엔터티를 상속하는 것이 아니라 클래스를 작성하는 것 같습니다. 그 이유는 무엇입니까? 이렇게하면 코드가 더 복잡해집니다.

마지막으로, 당신이 무엇을하려고하는지 정말 말하기 어렵습니다. 전체 .h 파일을 포함시킬 수 있습니까? 그리고 전체 메서드 선언?

앤드류

+0

채팅 응용 프로그램을 개발 중이며 테이블보기 (데이터 배열)에 채팅 메시지가 있습니다. 앱을 종료하고 다시로드하면 채팅 기록을 모두 저장해야합니다. 내가 문자열로 들어오는 메시지를 테이블 배열에 추가했습니다. 배열을 만들지 않고 핵심 데이터에 텍스트 문자열로 메시지를 추가하면 응용 프로그램을 다시로드 할 때 테이블보기의 배열에 어떻게 추가 할 수 있습니까? –

+0

Brandon, NSFetchedResultsController는 핵심 데이터 모델 및 인터페이스에서 자연스럽게 UITableView를 사용하여 배열을 가져 오도록 특별히 설계되었습니다. IOW, 당신이 가진 문제를 해결합니다. 앤드류 – adonoho