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_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'
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
.
User contributions licensed under CC BY-SA 3.0