2010-11-30 10 views
0

テストMac OSアプリケーションからiPhoneアプリケーションにコアデータコードを移植しようとしています。私は、フェッチのためのコードのすべてを管理するためのヘルパーメソッドを設定、およびすべてのものは、Mac OS上で素晴らしい作品が、私はiPhone上でこのエラーが表示されます。ここでは「デッドシンプルフェッチ要求時に_Unwind_Resume」が呼び出されました

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. 

は、ヘルパーメソッドを呼び出すコードであります:

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

(つまり、結果として得られるエラーを変更していない除去が、エラーチェックを取り除い)ヘルパーメソッド:

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

} 

故障のポイントヘルパーメソッドである:

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

ヘルパーメソッドからコードを外すこともできません。

それが役立つかどうかは分かりませんが、私のヘルパーメソッドで私のエラー処理コードを除去した後、私はこれを取得:

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' 

しかし、再び、これはすべてに完璧に働いていましたマックOS。私は_Unwind_Resumeを検索しようとしましたが、それはApple側のバグであると思われます。少なくとも12ダースの違う方法とそれを解決する十数の方法があります。私が考えることができる唯一の違いは、CDストアには1つのインスタンスが(意図的に)存在し、問題の1つは多くのことを持つことができることです。何か案は?

答えて

0

これを回避する方法を説明します。検索に使用した述語では、ALLキーワードはANYである必要があります。

なぜ私は理解できませんこの場合です。与えられたエラーはかなり不明瞭で、それがEXC_BAD_ACCESSで終わるという事実は非常に厄介です。私はなぜANYALLの間にこのような違いがあるのか​​説明できる人のために答えを受け入れるつもりです。

+0

データモデルと述語は表示されませんが、ALLとANYは異なるテストです。 ALLはtrueを返します。評価されるすべての属性はtrueと評価されます。 ANYはtrueを返します。評価される属性の1つ以上がtrueと評価されます。よくある間違いは、複数の関係を横断するためにALLを試してみることです。なぜそれが失敗したのかを知りたければ、エンティティマップと述語で新しい質問を投稿したいかもしれません。 – TechZen