2011-12-10 2 views
0

코어 데이터 및 관계에 문제가 하나 있습니다. 이것은 잠시 동안 솔루션없이 나를 지켜 주었고 동시에 찾기가 쉽기 때문에 문제를 재현 할 수있는 작은 샘플 애플리케이션을 만들었습니다. XCode에서 "저장소에 코어 데이터 사용"을 선택하여 베어 본 윈도우 기반 응용 프로그램을 만들었습니다. 이 응용 프로그램을 Core-Data-Relationship에 대해 "CDR"이라고했습니다. 그런 다음 CDRViewController라는 UIViewController의 하위 클래스를 추가했습니다. 내가 보통하는 것처럼. CDR_ViewController.h에서 첫째 : CDR_ViewController.m에서 다음응용 프로그램을 중지 한 후 코어 데이터 재배치가 작동하지 않습니다.

#import <UIKit/UIKit.h> 
#import "AppDelegate_Shared.h" 

@interface CDR_ViewController : UIViewController { 
UILabel *cdrLabel; 
NSManagedObject *currentItem; 
} 

@property (nonatomic, retain) IBOutlet UILabel *cdrLabel; 

-(IBAction) handleButtonClick:(id)sender; 

@end 

의 viewDidLoad 방법은 다음과 같다 :

- (void)viewDidLoad { 
[super viewDidLoad]; 

NSFetchRequest *request; 
NSError *error; 

AppDelegate_Shared *appDelegate = [[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

request=[[NSFetchRequest alloc] init]; 
[request setEntity: [NSEntityDescription entityForName:@"CDR_Entity" inManagedObjectContext:context]]; 

error=nil; 
NSUInteger count = [context countForFetchRequest:request error:&error]; 
[request release]; 
if (count!=0) { 
    request=[[NSFetchRequest alloc] init]; 
    [request setEntity: [NSEntityDescription entityForName:@"CDR_Entity" inManagedObjectContext:context]]; 
    error=nil; 
    NSArray *objects=[context executeFetchRequest:request error:&error]; 
    NSLog(@"Error:%@",error); 
    [request release]; 
    currentItem=[objects objectAtIndex:0]; 
    return; 
} 

NSManagedObject *newItemOne,*newItemTwo,*newItemThree; 

request=[[NSFetchRequest alloc] init]; 
[request setEntity: [NSEntityDescription entityForName:@"CDR_Entity" inManagedObjectContext:context]]; 

newItemOne=[NSEntityDescription insertNewObjectForEntityForName:@"CDR_Entity" inManagedObjectContext:context]; 
newItemTwo=[NSEntityDescription insertNewObjectForEntityForName:@"CDR_Entity" inManagedObjectContext:context]; 
newItemThree=[NSEntityDescription insertNewObjectForEntityForName:@"CDR_Entity" inManagedObjectContext:context]; 

[newItemOne setValue:[NSNumber numberWithInteger:1] forKey:@"Value"]; 
[newItemTwo setValue:[NSNumber numberWithInteger:2] forKey:@"Value"]; 
[newItemThree setValue:[NSNumber numberWithInteger:3] forKey:@"Value"]; 

[newItemOne setValue:newItemThree forKey:@"Previous"]; 
[newItemOne setValue:newItemTwo forKey:@"Next"]; 
[newItemTwo setValue:newItemOne forKey:@"Previous"]; 
[newItemTwo setValue:newItemThree forKey:@"Next"]; 
[newItemThree setValue:newItemTwo forKey:@"Previous"]; 
[newItemThree setValue:newItemOne forKey:@"Next"]; 

error=nil; 
[context save:&error]; 
[request release]; 
currentItem=newItemOne; 
} 

그리고 따를 수있는 viewWillAppear 방법 는 여기에 추가 관련 코드 :

- (void) viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
cdrLabel.text=[NSString stringWithFormat:@"%@",[currentItem valueForKey:@"Value"]]; 
} 

마지막으로 handleButtonClick 방법은 다음과 같다 :

-(IBAction) handleButtonClick:(id)sender 
{ 
if (((UIButton*)sender).tag==101) {// Previous item. 
    currentItem=[currentItem valueForKey:@"Previous"]; 
} else /*(((UIButton*)sender).tag==102)*/ {// Next item. 
    currentItem=[currentItem valueForKey:@"Next"]; 
} 
cdrLabel.text=[NSString stringWithFormat:@"%@",[currentItem valueForKey:@"Value"]]; 
} 

CDR_ViewController.xib에는 하나의 레이블과 두 개의 버튼이 있습니다.

이 코드는 처음에는 제대로 작동합니다. 즉, 앱을 컴파일하고 iPhone 시뮬레이터의 내용을 재설정 한 직후입니다. 그런 다음 라벨의 내용을 순환시킬 수 있습니다 : 1,2,3,1,2,3,1,2,3 --- 등 ... 버튼으로 뒤로 가십시오. Command-Q를 사용하여 응용 프로그램을 종료하는 즉시. 나는 다시 시작 할 때의 충돌 :

currentItem=[currentItem valueForKey:@"Previous"]; 

나 :

currentItem=[currentItem valueForKey:@"Next"]; 

을 handleButtonClick 방법 내부. 그리고 iPod touch에 앱을 넣을 때도 마찬가지입니다.

누구든지 내 행동을 설명 할 수있는 코드를 볼 수 있습니까?

+0

어떻게 답변을 수락합니까? 나는 그들 중 상당수를 실제로 받아들이고 싶다. 내가 언급 한 링크를 살펴 보겠습니다. – Michel

답변

0

시뮬레이터에서 앱을 종료하면 시뮬레이터에서 홈 버튼을 클릭하는 것과 달리 프로그램이 SIGKILL 메시지를 보내 실행을 즉시 중지합니다. 응용 프로그램 위임 메서드 (종료, 배경 입력 등)가 호출되지 않습니다.

아마도 관리 대상 개체 컨텍스트가 저장되지 않았기 때문에 앱을 다시 실행할 때 개체 그래프를 제대로 복원 할 수 없습니다. 샘플 앱에서 컨텍스트를 저장하는 다른 버튼을 추가하십시오. 이 버튼을 클릭하고 앱을 종료하면 문제가 해결됩니까?

+0

문제는 내가 홈 버튼을 사용하여 닫아야하는 기기에서 실행할 때 문제가 여전히 동일하다는 것입니다. 그리고 당신이 내 코드에서 볼 수 있듯이 [context save : & error]; 명령을 저장하십시오. 한가지 더 말하자면, 응용 프로그램을 시작하면 Command-Q가 첫 번째 값을 올바르게 표시 한 후에도 충돌하는 버튼 2 개 중 하나만 누르면됩니다. – Michel

+0

충돌하는 방식에 대한 자세한 내용을 게시 할 수 있습니까? 디버거에서 판독 값을 얻습니까? – jrturton

관련 문제