J'essaie de transférer un code Core Data depuis une application test Mac OS vers une application iPhone. Je mis en place une méthode d'assistance pour gérer l'ensemble du code pour les récupérations, et tout fonctionne très bien sur Mac OS, mais je reçois cette erreur sur l'iPhone:"_Unwind_Resume" appelé demande d'extraction simple morte
Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
_Unwind_Resume called from function -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] in image CoreData.
Voici le code qui appelle la méthode d'aide :
// get authors and title THIS WORKS
NSArray *bookInfoFetchResults = [self getEntitiesByName:kOC_CD_ObjectKey_bookInfo
usingPredicateValue:@"contentRoot.bookInfo.bookAuthors > \"\""
withSubstitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:nil]
inModel:model
andContext:context
sortByAttribute:nil];
int thisResult = 0;
int lastResult = [bookInfoFetchResults count];
for (thisResult = 0; thisResult < lastResult; thisResult++) {
NSManagedObject *currentResult = [bookInfoFetchResults objectAtIndex:thisResult];
NSLog(@"bookAuthors: %@", [currentResult valueForKey:kOC_CD_ObjectAttribute_bookAuthors]);
NSLog(@"bookTitle: %@", [currentResult valueForKey:kOC_CD_ObjectAttribute_bookTitle]);
}
// get chapters THIS DOES NOT WORK
NSArray *chapterFetchResults = [self getEntitiesByName:kOC_CD_ObjectKey_chapter
usingPredicateValue:@"ALL contentRoot.chapters.title > \"\""
withSubstitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:nil]
inModel:model
andContext:context
sortByAttribute:kOC_CD_ObjectAttribute_key];
int thisChapterResult = 0;
int lastChapterResult = [chapterFetchResults count];
for (thisChapterResult = 0; thisChapterResult < lastChapterResult; thisChapterResult++) {
NSManagedObject *currentChapterResult = [chapterFetchResults objectAtIndex:thisChapterResult];
NSLog(@"Chapter %@: %@", [currentChapterResult valueForKey:kOC_CD_ObjectAttribute_number], [currentChapterResult valueForKey:kOC_CD_ObjectAttribute_title]);
}
la méthode d'assistance (dépouillées de vérification des erreurs, mais la suppression qui n'a pas changé l'erreur résultant):
- (NSArray *) getEntitiesByName:(NSString *)entityName usingPredicateValue:(NSString *)predicateValue withSubstitutionVariables:(NSDictionary *)variablesDict inModel:(NSManagedObjectModel *)aModel andContext:(NSManagedObjectContext *)aContext sortByAttribute:(NSString *)sortingAttribute; {
NSArray *fetchResults;
NSString *fetchRequestTemplateName = [NSString stringWithFormat:@"get_%@", entityName];
NSFetchRequest *fetchRequestTemplate = [[NSFetchRequest alloc] init];
NSEntityDescription *targetEntityDescription;
targetEntityDescription = [[aModel entitiesByName] objectForKey:entityName];
[fetchRequestTemplate setEntity:targetEntityDescription];
// need to find a way to catch an error here in case we give something that isn't right
// NSInvalidArgumentException: Unable to parse the format string "MQaynH5bXs"
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:predicateValue];
[fetchRequestTemplate setPredicate:predicateTemplate];
[aModel setFetchRequestTemplate:fetchRequestTemplate forName:fetchRequestTemplateName];
[fetchRequestTemplate release];
if (variablesDict == nil) {
variablesDict = [NSDictionary dictionaryWithObjectsAndKeys:nil];
[variablesDict retain];
}
NSFetchRequest *fetchRequestToExecute = [aModel fetchRequestFromTemplateWithName:fetchRequestTemplateName substitutionVariables:variablesDict];
NSError *fetchError;
fetchResults = [aContext executeFetchRequest:fetchRequestToExecute error:&fetchError];
if ((sortingAttribute != nil) && (fetchResults != nil)) {
NSSortDescriptor *attributeSorter = [[NSSortDescriptor alloc] initWithKey:sortingAttribute ascending:YES];
fetchResults = [fetchResults sortedArrayUsingDescriptors:[NSArray arrayWithObject:attributeSorter]];
[attributeSorter release];
}
return fetchResults;
}
le point de défaillance dans la méthode d'assistance est:
fetchResults = [aContext executeFetchRequest:fetchRequestToExecute error:&fetchError];
La suppression du code de la méthode auxiliaire ne fonctionne pas non plus.
Je ne sais pas si cela peut aider, mais après décapage mon code de gestion des erreurs dans ma méthode d'aide, je reçois ceci:
2010-11-30 16:31:30.633 OC Flash Card Core 2[19306:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported predicate (null)'
*** Call stack at first throw:
(
0 CoreFoundation 0x02655b99 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x027a540e objc_exception_throw + 47
2 CoreData 0x02381e86 -[NSSQLGenerator generateSQLStatementForFetchRequest:ignoreInheritance:countOnly:] + 1254
3 CoreData 0x023816f0 -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 480
4 CoreData 0x02381501 -[NSSQLAdapter newSelectStatementWithFetchRequest:] + 49
5 CoreData 0x023813ae -[NSSQLCore newRowsForFetchPlan:] + 430
6 CoreData 0x02380b09 -[NSSQLCore objectsForFetchRequest:inContext:] + 297
7 CoreData 0x023806fe -[NSSQLCore executeRequest:withContext:error:] + 206
8 CoreData 0x0242e91c -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1084
9 CoreData 0x0237d897 -[NSManagedObjectContext executeFetchRequest:error:] + 359
10 OC Flash Card Core 2 0x0000360e -[OCContentImporterObj getEntitiesByName:usingPredicateValue:withSubstitutionVariables:inModel:andContext:sortByAttribute:] + 481
11 OC Flash Card Core 2 0x00002af7 -[OCContentImporterObj testCoreDataIntegrity] + 188
12 OC Flash Card Core 2 0x00002864 -[OCContentImporterObj importContent] + 88
13 OC Flash Card Core 2 0x0000252b -[AppDelegate_iPhone application:didFinishLaunchingWithOptions:] + 91
14 UIKit 0x002b4f27 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
15 UIKit 0x002b73b0 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 346
16 UIKit 0x002c13ec -[UIApplication handleEvent:withNewEvent:] + 1958
17 UIKit 0x002b9b3c -[UIApplication sendEvent:] + 71
18 UIKit 0x002be9bf _UIApplicationHandleEvent + 7672
19 GraphicsServices 0x02f35822 PurpleEventCallback + 1550
20 CoreFoundation 0x02636ff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
21 CoreFoundation 0x02597807 __CFRunLoopDoSource1 + 215
22 CoreFoundation 0x02594a93 __CFRunLoopRun + 979
23 CoreFoundation 0x02594350 CFRunLoopRunSpecific + 208
24 CoreFoundation 0x02594271 CFRunLoopRunInMode + 97
25 UIKit 0x002b6c6d -[UIApplication _run] + 625
26 UIKit 0x002c2af2 UIApplicationMain + 1160
27 OC Flash Card Core 2 0x00001ce0 main + 102
28 OC Flash Card Core 2 0x00001c71 start + 53
)
terminate called after throwing an instance of 'NSException'
Mais, encore une fois, tout cela a parfaitement fonctionné dans le Mac OS. J'ai essayé de chercher _Unwind_Resume
mais cela semble être un bug de la part d'Apple, et il y a au moins une douzaine de façons différentes de le toucher et une douzaine de façons différentes de le résoudre. Le seul différentiel que je peux penser est qu'une tentative a seulement une instance dans le magasin de CD (intentionnellement) et la seconde, le problème, peut en avoir plusieurs. Des idées?
Ne peut pas dire avec certitude sans voir votre modèle de données et votre prédicat, mais tous et tous sont des tests différents. ALL renvoie true si chaque attribut évalué est évalué à true. Tout retourne vrai est un ou plusieurs attributs évalués évalue à vrai. Une erreur courante consiste à essayer d'utiliser ALL pour transversaliser plusieurs relations. Vous pourriez vouloir poster une nouvelle question avec votre carte d'entité et le prédicat si vous voulez savoir pourquoi il a échoué. – TechZen