继续使用核心数据获得sigabrt错误

时间:2011-09-02 11:52:59

标签: iphone cocoa-touch cocoa core-data

我目前正在学习核心数据,并正在研究苹果核心数据教程(地点)的简单版本。

以下是addEvent方法的代码:

Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext];
[event setCreationDate:[NSDate date]];


NSError *error;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}


[eventsArray insertObject:event atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

当触发此方法时,我收到sigabrt错误。但是我发现,如果我包含apple的viewDidLoad代码,那么错误就不再发生了,我不能为我的生活找出原因?

这是阻止错误发生的代码:

- (void)viewDidLoad {

[super viewDidLoad];

// Set the title.
self.title = @"Locations";

// Configure the add and edit buttons.
self.navigationItem.leftBarButtonItem = self.editButtonItem;

addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addEvent)];
self.navigationItem.rightBarButtonItem = addButton;



/*
 Fetch existing events.
 Create a fetch request; find the Event entity and assign it to the request; add a sort descriptor; then execute the fetch.
 */

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

// Order the events by creation date, most recent first.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
    // Handle the error.
}

// Set self's events array to the mutable array, then clean up.
[self setEventsArray:mutableFetchResults];
[mutableFetchResults release];
[request release];

我缺少什么?我不知道viewDidLoad上缺少抓取请求会导致错误

由于

2 个答案:

答案 0 :(得分:1)

您的tableview如何知道要显示哪些事件?

Apple的viewDidLoad方法的一个副作用是它将创建eventsArray。如果你没有创建它,但你告诉你的tableView你已插入一行,你最好有那行可用!

你正在打电话

[eventsArray insertObject:event atIndex:0];

但我敢打赌,如果没有Apple的viewDidLoad方法,eventsArraynil - 如果它是nil(即eventsArray = [[NSMutableArray alloc] init];

答案 1 :(得分:1)

在使用Apple的教程时,我遇到了同样的问题。

逐步调试,它正在落在

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

就行了      - (无效)的addEvent 在RootViewController.m

原始海报上的代码阻止错误发生的原因是因为 - (void)viewDidLoad中缺少位置管理器触发的行。

[[self locationManager] startUpdatingLocation]

因此当

-(void)addEvent 

被触发,程序正在返回并退出

if (!location) {
    return;
}

因此没有进入违规行,我将startUpdatingLocation添加回原始海报代码的viewDidLoad,并且sigabrt错误又回来了。

我知道这不是答案,但我希望这可以节省半个小时的其他人。