コアデータとリレーションシップに関する問題が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にアプリを置いたときも同じです。
誰でも私のコードでこの動作を説明できるものは見えますか?
回答を受け入れるにはどうすればよいですか?私は実際にそれらの良い数を受け入れたいと思います。あなたが言及しているリンクを見ていきます。 – Michel