Я пытаюсь получить тестовое приложение с работающими ключевыми данными, но в данный момент я больше не нахожусь, надеюсь, кто-то может мне помочь в этом.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
Моя модель в соответствии с просьбой:
мое правило удаления:
Можете ли вы опубликовать график моделей основных данных? – giorashc
Используете ли вы какие-то ограничения, которые могут привести к возврату вашего массива null – iEinstein
Привет, добавлен график. – Eloy