2013-12-10 2 views
0

Я пытаюсь получить тестовое приложение с работающими ключевыми данными, но в данный момент я больше не нахожусь, надеюсь, кто-то может мне помочь в этом.NSMutableArray теряет все записи после удаления одной записи

Я создаю приложение для хранения клиентов и их проектов. В качестве примера я использую данные Core с использованием приложения Big Nerd Ranch. Это приложение использует данные Core.

Что я хочу сделать, так это то, что вы можете удалить проект с клиента. Только когда я удаляю проект у клиента с несколькими проектами, моя программа переходит в ошибку.

Как вы можете увидеть в файле журнала в нижней части, после удаления, мой метод

-(NSArray *)relatedProjects:(Client *)client 

не содержит каких-либо проектов больше. В то время как в

-(void)removeProject:(Project *)project 

бревна показаны 2 записей.

Я использую Datastore:

-(NSArray *)relatedProjects:(Client *)client; { 
    NSFetchRequest *request = [[NSFetchRequest alloc]init]; 

    NSEntityDescription *e = [[model entitiesByName] objectForKey:@"Project"]; 

    [request setEntity:e]; 

    // Check if client is related to Project 
    [request setPredicate: [NSPredicate predicateWithFormat:@"clients = %@", client.objectID]]; 

    NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"project" 
                 ascending:YES]; 
    [request setSortDescriptors:[NSArray arrayWithObject:sd]]; 

    NSError *error; 
    NSArray *result = [context executeFetchRequest:request error:&error]; 

    if (!result) { 
     [NSException raise:@"Fetch failed" 
        format:@"Reason: %@", [error localizedDescription]]; 
    } 

    relatedProjects = [[NSMutableArray alloc] initWithArray:result]; 

    for (NSString *p in relatedProjects) { 
     NSLog(@"RELATEDPROJECTS %@", p); 
    } 

    if ([relatedProjects count] == 0) { 
     NSLog(@"relatedProjects is empty"); 
    } 


    return relatedProjects; 
    } 

-

-(void)removeProject:(Project *)project { 
    // remove from NSManagedObjectContext 
    [context deleteObject:project]; 

    // remove from allProjects array 
    [allProjects removeObjectIdenticalTo:project]; 

    NSLog(@"relatedprojects in remove %@", relatedProjects); 

    // remove from relatedProjects array 
    [relatedProjects removeObjectIdenticalTo:project]; 

    NSLog(@"relatedprojects in AFTER remove %@", relatedProjects); 

    NSLog(@"removed project %@", [project project]); 

} 

и мой ViewController

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     BITDataStore *ds = [BITDataStore sharedStore]; 
     NSArray *selectedProjects = [ds relatedProjects:client]; 

     /* for (NSString *p in selectedProjects) { 
      NSLog(@"selectedProjects %@", p); 
        NSLog(@"IndexPath row %d", [indexPath row]); 
     } 
     */ 

     Project *pr = [selectedProjects objectAtIndex:[indexPath row]]; 
     NSLog(@" te verwijderen project is %@ voor client %@", [pr project], [client name]); 

     [ds removeProject:pr]; 

     // Delete the row from the data source 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; // lijkt dezelfde werking te hebben: [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 

    } 
    else if (editingStyle == UITableViewCellEditingStyleInsert) { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
     } } 

My Log

2013-12-10 14:11:49.863[37414:70b] relatedprojects in remove (
    "<NSManagedObject: 0x8c83880> (entity: Project; id: 0x8c83260 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Project/p4> ; data: {\n clients = \"0x8c75430 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Client/p1>\";\n orderingValue = nil;\n project = 123;\n tasksProjects = \"<relationship fault: 0x8e71750 'tasksProjects'>\";\n})", 
    "<NSManagedObject: 0x8c83ac0> (entity: Project; id: 0x8c83270 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Project/p1> ; data: {\n clients = \"0x8c75430 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Client/p1>\";\n orderingValue = nil;\n project = ABC;\n tasksProjects = \"<relationship fault: 0x8c894f0 'tasksProjects'>\";\n})", 
    "<NSManagedObject: 0x8c83b20> (entity: Project; id: 0x8c83280 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Project/p2> ; data: {\n clients = \"0x8c75430 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Client/p1>\";\n orderingValue = nil;\n project = XYZ;\n tasksProjects = \"<relationship fault: 0x8d68f90 'tasksProjects'>\";\n})" 
) 
2013-12-10 14:11:49.863[37414:70b] relatedprojects in AFTER remove (
    "<NSManagedObject: 0x8c83880> (entity: Project; id: 0x8c83260 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Project/p4> ; data: {\n clients = \"0x8c75430 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Client/p1>\";\n orderingValue = nil;\n project = 123;\n tasksProjects = \"<relationship fault: 0x8e71750 'tasksProjects'>\";\n})", 
    "<NSManagedObject: 0x8c83b20> (entity: Project; id: 0x8c83280 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Project/p2> ; data: {\n clients = \"0x8c75430 <x-coredata://71BDF48B-7B2E-487D-A1E2-013904BB6757/Client/p1>\";\n orderingValue = nil;\n project = XYZ;\n tasksProjects = \"<relationship fault: 0x8d68f90 'tasksProjects'>\";\n})" 
) 
2013-12-10 14:11:49.864[37414:70b] removed project ABC 
2013-12-10 14:11:49.865[37414:70b] related projects is empty 
2013-12-10 14:11:49.866[37414:70b] **** client in numberOfRowsInSection is CLIENTX 
2013-12-10 14:11:49.866[37414:70b] related projects is empty 

Моя модель в соответствии с просьбой: enter image description here

мое правило удаления: enter image description here enter image description here

+0

Можете ли вы опубликовать график моделей основных данных? – giorashc

+0

Используете ли вы какие-то ограничения, которые могут привести к возврату вашего массива null – iEinstein

+0

Привет, добавлен график. – Eloy

ответ

1

Я не уверен, я понимаю вашу цель, но ... если я удалю клиент Я хотел бы чтобы удалить все его проекты. Итак, каскадное правило для projects в порядке. Напротив, если я удалю проект, клиент не должен удаляться. Итак, nullify для clients должно быть лучше.

Это работает для вас? Пожалуйста, также см. Мой предыдущий ответ, поскольку есть глубокое объяснение аргумента.

Setting up a parent-child relationship in Core Data

+0

ДА, вот и все! Я искал это в течение нескольких дней. Я был так занят, глядя на код, который я забыл о правилах удаления. Большое спасибо! – Eloy

+0

@ Элой Йор приветствую :-) –

Смежные вопросы