2011-12-10 7 views
0

コアデータとリレーションシップに関する問題が1つあります。これはしばらく解決せずに私を維持していると同時に、見つけるのが簡単だった私は、問題を再現するための小さなサンプルアプリケーションを作った。 XCodeの下で、 "コアデータをストレージに使用する"をチェックして、ベアボーンのウィンドウベースのアプリケーションを作成しました。 私はこのアプリケーションをCore-Data-Relationshipの "CDR"と呼んだ。 次に、CDR_ViewControllerというUIViewControllerのサブクラスを追加しました。私はいつもそうしています。ここ は、私が追加関連するコードです:CDR_ViewController.hで まず:アプリケーションを停止した後、コアデータリラシオンが機能しない

- (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メソッドは以下の通りです:

#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 

はその後CDR_ViewController.mでviewDidLoadメソッドは以下の通りです:

- (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には、1つのラベルと2つのボタンが含まれています。

このコードは、アプリケーションをコンパイルしてiPhoneシミュレータの内容をリセットした直後に意味があります。 それから、ラベルの内容を1,2,3,1,2,3,1,2,3 ---などのように循環させることができます。 Command-Qを使用してアプリケーションを終了するとすぐに。

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

か::handleButtonClickメソッド内

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

私は再びそれを開始したい場合は、上のクラッシュ。 iPod touchにアプリを置いたときも同じです。

誰でも私のコードでこの動作を説明できるものは見えますか?

+0

回答を受け入れるにはどうすればよいですか?私は実際にそれらの良い数を受け入れたいと思います。あなたが言及しているリンクを見ていきます。 – Michel

答えて

0

シミュレータでホームボタンをクリックするのとは反対に、シミュレータ内のアプリケーションを停止して終了すると、プログラムはSIGKILLメッセージを送信し、すぐに実行を停止します。アプリケーションのデリゲートメソッド(終了する、背景を入力するなど)は呼び出されません。

これは、管理対象オブジェクトのコンテキストが保存されていない可能性があるため、アプリケーションを再実行すると、オブジェクトグラフを適切に復元できません。サンプルアプリケーションで、コンテキストを保存する別のボタンを追加します。このボタンをクリックしてアプリを終了すると、問題は解決しますか?

+0

問題は、ホームボタンを使用して閉じる必要があるデバイスを実行すると、問題は同じです。私のコードで見ることができるように、私は[context save:&error]を入れました。命令を保存します。もう1つの発言は、アプリケーションを起動するとCommand-Qの最初の値が正しくポップアップした後でも、クラッシュする2つのボタンの1つを押したときだけです。 – Michel

+0

クラッシュの詳細を投稿できますか?あなたはデバッガで読み込みを取得しますか? – jrturton

関連する問題