2010-11-30 2 views
0

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?

Répondre

0

Comment résoudre ce problème: Dans le prédicat utilisé pour la recherche, le mot-clé ALL doit être ANY.

Ce que je ne comprends pas est pourquoi c'est le cas. L'erreur donnée semble être assez obscure, et le fait qu'elle se termine par EXC_BAD_ACCESS est très troublant. Je suis prêt à accepter la réponse pour quiconque peut expliquer pourquoi il y a une telle différence entre ANY et ALL.

+0

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

Questions connexes