Ios4 停止应用程序后核心数据关系不起作用

Ios4 停止应用程序后核心数据关系不起作用,ios4,core-data,ios5,ios-simulator,relationship,Ios4,Core Data,Ios5,Ios Simulator,Relationship,我对核心数据和关系有一个问题。由于这让我有一段时间没有解决方案,同时也很容易找到,所以我制作了一个小样本应用程序来重现这个问题。 在XCode下,我创建了一个基于裸骨窗口的应用程序,检查使用核心数据进行存储。 我将此应用程序称为核心数据关系的CDR。 然后,我添加了一个名为CDR_ViewController的UIViewController子类;就像我通常做的那样。 以下是我添加的相关代码: CDR_ViewController.h中的第一个: #import <UIKit/UIKit.

我对核心数据和关系有一个问题。由于这让我有一段时间没有解决方案,同时也很容易找到,所以我制作了一个小样本应用程序来重现这个问题。 在XCode下,我创建了一个基于裸骨窗口的应用程序,检查使用核心数据进行存储。 我将此应用程序称为核心数据关系的CDR。 然后,我添加了一个名为CDR_ViewController的UIViewController子类;就像我通常做的那样。 以下是我添加的相关代码: CDR_ViewController.h中的第一个:

#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
VIEWWILLEXPEND方法如下所示:

- (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;
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
cdrLabel.text=[NSString stringWithFormat:@"%@",[currentItem valueForKey:@"Value"]];
}
-(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"]];
}
最后,手柄按钮点击方法如下:

- (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;
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
cdrLabel.text=[NSString stringWithFormat:@"%@",[currentItem valueForKey:@"Value"]];
}
-(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"];
或:

把手内的按钮单击方法。 当我把应用程序放在我的iPodtouch上时也是一样的


有人能在我的代码中看到任何可以解释这种行为的东西吗?

如果您通过停止模拟器中的应用程序来终止它,而不是单击模拟器中的home按钮或其他方式,那么程序将发送一条SIGKILL消息,立即停止运行。您的应用程序委托方法将终止,将进入后台等将不会被调用


很可能这意味着您的托管对象上下文尚未保存,因此在重新运行应用程序时,无法正确恢复对象图。在示例应用程序中,添加另一个保存上下文的按钮。如果单击此按钮,然后终止应用程序,这是否解决了问题?

问题是,当我在设备上运行时,必须使用“主页”按钮关闭,问题仍然存在。正如您在我的代码中所看到的,我已经放置了一个[context save:&error];指令,以便保存。还有一点值得注意的是,当我启动应用程序时,即使在一个命令-Q第一个值正确弹出后,只有当我按下两个按钮中的一个时,它才会崩溃。你能发布更多关于它崩溃的详细信息吗?调试器中有读数吗?我如何接受答案?实际上,我想接受很多。我会看看你提到的链接。