开发者

"_Unwind_Resume" called upon dead simple fetch request

I'm trying to port over some Core Data code over from a test Mac OS application to an iPhone app. I set up a helper method to manage all of the code for the fetches, and everything works great on the Mac OS, but I get this error on the iPhone:

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.

Here is the code that calls the helper method:

// 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]);
    }

The helper method (stripped of error-checking, though removing that didn't change the resulting error):

- (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;

}

The point of failure in the helper method is:

fetchResults = [aContext executeFetchRequest:fetchRequestToExecute error:&fetchError];

Breaking out the code from the helper method doesn't work either.

I don't know if it would help, but after stripping out my error-handling code in my helper method, I get this:

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_FUNCTIO开发者_JS百科N__ + 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'

But, again, all of this worked flawlessly in the Mac OS. I've tried searching for _Unwind_Resume but it seems to be a bug on Apple's part, and there are at least a dozen different ways to hit it and a dozen different ways to resolve it. The only differential that I can think of is that one attempt only has one instance in the CD store (intentionally so) and the second, the trouble one, can have many. Any ideas?


Figured out how to get around this: In the predicate used to search, the ALL keyword needs to be ANY.

What I don't understand is why this is the case. The error given seems to be fairly obscure, and the fact that it ends up with EXC_BAD_ACCESS is very troubling. I'm willing to accept the answer for anyone who can explain why there is such a difference between ANY and ALL.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜