iphone上的Coredata:我只能在重新启动应用程序时删除数据

时间:2010-11-25 08:24:08

标签: iphone core-data

我有一个简单的应用程序,可以让您在地址簿中创建人员组...因此,群组和人员处于一对多的关系中,因为一个群组可以有多个人。因为我创建了自己的Person模型,所以这不是多对多。

添加数据没有问题。

删除数据不会。如果我创建一个新的Person,我必须重新启动应用程序才能将其删除,或者删除Person所属的Group。否则我在控制台中得到“EXC BAD ACCESS”。在环境中使用NSZombieEnabled,我得到-[CFString release]: message sent to deallocated instance 0x75140d0

我从XCode自动创建的CoreData内容开始,创建RootViewController(TableViewController的子类),我将它传递给上下文并将其放在NavigationController中。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

//Creo il controller root e gli passo il context
RootViewController *rvc = [[RootViewController alloc] initWithStyle:UITableViewStylePlain];
rvc.context = [self managedObjectContext];

//Creo il navcon, gli associo il root e lo rendo visibile
navCon = [[UINavigationController alloc] initWithRootViewController:rvc];
[window addSubview:navCon.view];
[window makeKeyAndVisible];

[rvc release];
return YES;

}

RootViewController显示组,然后单击一行可以修改该组中的人员,传递“nuovogruppo”(与该行关联的组模型)

- (void)showPersoneControllerWithGruppo:(Gruppo *)nuovogruppo {

PersoneController *pc = [[PersoneController alloc] initWithStyle:UITableViewStylePlain];
pc.gruppo = nuovogruppo;
pc.context = self.context;
pc.delegate = self;
//NSLog(@"%@",[gruppi objectAtIndex:indexPath.row]);
[self.navigationController pushViewController:pc animated:YES];
[pc release];

}

这就是我删除这个人的方式(gruppo是这些人所属的群组模型,persone是一个在viewDidLoad上填充这些人的数组,removeGPObject是一个由XCode生成的访问者方法(小组与人的关系))

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {
    [gruppo removeGPObject:[persone objectAtIndex:indexPath.row]];
    [persone removeObjectAtIndex:indexPath.row];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    NSError *error;
    [context save:&error];
}

}

我希望有人可以帮助我...

更新

由于发送到已发布实例的消息出错,我尝试将所有[... release]行注释掉,最后找出导致问题的原因。问题出在记录的创建方法而不是删除方法中。这是我用来创建它的方法。 引起问题的那条线是[NomeCognome release] 如果有人能解释我为什么这条线会崩溃应用程序,我将非常感激。

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {

if (property == kABPersonPhoneProperty) {
    ABMultiValueRef phoneProperty = ABRecordCopyValue(person,property);
    NSString *phone = (NSString *)ABMultiValueCopyValueAtIndex(phoneProperty,identifier);
    NSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *surname = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
    NSString *NomeCognome = [NSString stringWithFormat:@"%@ %@", firstName, surname];
    [firstName release];
    [surname release];

    Persona *persona = (Persona *)[NSEntityDescription insertNewObjectForEntityForName:@"Persona" inManagedObjectContext:context];
    persona.ABRR = phone;
    persona.NomeCognome = NomeCognome;
    [phone release];
    [NomeCognome release]; //This line makes the app crash!!! Why???

    [gruppo addGPObject:persona];

    NSError *error;
    [context save:&error];
    [self.delegate PersoneControllerDidSave:self];
    [self loadContentAndReload:YES];
    [self dismissModalViewControllerAnimated:YES];
}

为什么该行会崩溃该应用?

1 个答案:

答案 0 :(得分:0)

最后使用reloadData方法,如下所示。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {
    [gruppo removeGPObject:[persone objectAtIndex:indexPath.row]];
    [persone removeObjectAtIndex:indexPath.row];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    NSError *error;
    [context save:&error];
    [tableView reloadData];
}

现在可能有效。