2014-06-17 4 views
6

Die App, die ich gerade übernommen habe, stürzt zu zufälligen Zeiten mit der "Die linke Seite für einen ALL oder ANY Operator muss entweder ein sein NSArray oder ein NSSet "Fehler.Die linke Seite für einen ALL- oder ANY-Operator muss entweder ein NSArray oder ein NSSet sein.

Die App versucht beim Absturz von Core Data zu lesen. Es stürzt nicht die ganze Zeit ab, nur zufällig. Ich bin mir nicht sicher, ob der PREDICATE das Problem verursacht oder zwei Threads auf Core Data zugreifen. Wenn es die PREDICATE wäre, würde ich denken, es würde jedes Mal abstürzen. Es gab mehrere Migrationen auf die db-Struktur. Vielleicht hat eine der Migrationen ein Objekt in einem seltsamen Zustand hinterlassen und es stürzt ab, wenn dieses Objekt jemals von Core Data geholt wird.

Hier sind das Prädikat nennt

+(NSString *)buildCompoundContainsStringForField:(NSString *)field searchTerm:(NSString *)search operator:(NSString *)operator 
{ 
NSArray *parts = [search componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
NSString *partJoin = [NSString stringWithFormat:@"'%@ %@ contains[c]'", operator, field]; 
NSString *compoundContains = [parts componentsJoinedByString:partJoin]; 
NSString *predicateString = [NSString stringWithFormat:@"%@ contains[c] '%@'", field, compoundContains]; 
return predicateString; 
} 



    NSPredicate *titleSearch = [AStore searchTitlePredicate:search]; 
    NSPredicate *ingredientSearch = [AStore searchIngredientsPredicate:search]; 
    NSPredicate *recipeDecription = [AStore searchDescriptionPredicate:search]; 
    NSPredicate *searchMethod = [AStore searchMethodPredicate:search]; 


+ (NSPredicate *)searchIngredientsPredicate:(NSString *)search { 
return [NSPredicate predicateWithFormat:[self buildCompoundContainsStringForField:@"ANY ingredients.desc" 
                     searchTerm:search 
                     operator:@"AND"]]; 
} 

+ (NSPredicate *)searchTitlePredicate:(NSString *)search { 
return [NSPredicate predicateWithFormat:[self buildCompoundContainsStringForField:@"ANY title" 
                     searchTerm:search 
                     operator:@"AND"]]; 
} 

+ (NSPredicate *)searchDescriptionPredicate:(NSString *)search { 
return [NSPredicate predicateWithFormat:[self buildCompoundContainsStringForField:@"ANY recipeDescription" 
                     searchTerm:search 
                     operator:@"AND"]]; 
} 

+ (NSPredicate *)searchMethodPredicate:(NSString *)search { 
return [NSPredicate predicateWithFormat:[self buildCompoundContainsStringForField:@"ANY method" 
                     searchTerm:search 
                     operator:@"AND"]]; 
} 

=== Verfahren, bei dem ITS ABSTURZ ======

-(void) updateDictionaryWithWeight:(int)weight usingRequest:(NSFetchRequest *)request 
{ 
    NSError *error; 
    NSArray *results = [self.context executeFetchRequest:request error:&error]; <---- CRASHES/ERRORS HERE 

...... 

} 

=== HIER DER RUF-Stack ====

*** First throw call stack: 
    (
     0 CoreFoundation      0x0000000103fbb495 __exceptionPreprocess + 165 
     1 libobjc.A.dylib      0x0000000103d1a99e objc_exception_throw + 43 
     2 Foundation       0x000000010351606b -[NSPredicateOperator performOperationUsingObject:andObject:] + 826 
     3 Foundation       0x0000000103515c1e -[NSComparisonPredicate evaluateWithObject:substitutionVariables:] + 314 
     4 Foundation       0x0000000103515ae2 -[NSPredicate evaluateWithObject:] + 19 
     5 CoreData       0x0000000101df40aa -[NSManagedObjectContext executeFetchRequest:error:] + 2170 
     6 CoreData       0x0000000101e3b18b -[NSManagedObjectContext(_NestedContextSupport) _parentObjectsForFetchRequest:inContext:error:] + 395 
     7 CoreData       0x0000000101ea5ed3 __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 563 
     8 libdispatch.dylib     0x00000001042ef72d _dispatch_client_callout + 8 
     9 libdispatch.dylib     0x00000001042de5d0 _dispatch_barrier_sync_f_invoke + 57 
     10 CoreData       0x0000000101e3af92 _perform + 114 
     11 CoreData       0x0000000101e3ae2d -[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:] + 301 
     12 CoreData       0x0000000101df3a21 -[NSManagedObjectContext executeFetchRequest:error:] + 497 
     13 Things        0x000000010035ff40 -[AStore updateDictionaryWithWeight:usingRequest:] + 128 
     14 Things        0x000000010035cce8 -[AStore weightedThingsWithSearchString:andFilterFlags:sortedBy:] + 920 
     15 Things        0x00000001003b87a7 -[ASearchViewController doSearchWithCompletionBlock:] + 1319 
     16 Things        0x00000001003be466 -[ASearchViewController localRefresh:] + 198 
     17 Things        0x00000001003c17e1 __59-[ASearchViewController filterControllerDidFinish:]_block_invoke + 577 
     18 Things        0x000000010059624e __72+[UIView(mfw) presentIndicatorWithLoadingTitle:successTitle:completion:]_block_invoke + 174 
     19 libdispatch.dylib     0x00000001042dc851 _dispatch_call_block_and_release + 12 
     20 libdispatch.dylib     0x00000001042ef72d _dispatch_client_callout + 8 
     21 libdispatch.dylib     0x00000001042df3fc _dispatch_main_queue_callback_4CF + 354 
     22 CoreFoundation      0x0000000104019289 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 
     23 CoreFoundation      0x0000000103f66854 __CFRunLoopRun + 1764 
     24 CoreFoundation      0x0000000103f65d83 CFRunLoopRunSpecific + 467 
     25 GraphicsServices     0x0000000104b2bf04 GSEventRunModal + 161 
     26 UIKit        0x0000000102493e33 UIApplicationMain + 1010 
     27 Things        0x0000000100002463 main + 115 
     28 libdyld.dylib      0x00000001045405fd start + 1 
     29 ???         0x0000000000000001 0x0 + 1 
    ) 
    libc++abi.dylib: terminating with uncaught exception of type NSException 
+0

Wie sieht das Prädikat aus, das den Operator "ALL oder ANY" enthält? –

+0

Sie erstellen mehrere Prädikate (mit unbekannten Methoden wie buildCompoundContainsStringForField), so dass es für mich unklar ist, welche Prädikat oder Abrufanforderung den Absturz verursacht. - Vielleicht können Sie einen "Exception Breakpoint" und dann "po request" in der Debugger-Konsole setzen, wenn der Absturz auftritt. Auch Informationen zu den Entitäten und Beziehungen wären hilfreich. –

+0

Es wird durch das TITLE-Prädikat verursacht, das ANY-Titel ist. CONTAINS [c] "sh" Wird auch den ursprünglichen Beitrag aktualisieren und diese Methode einschließen. – jdog

Antwort

7

Das Problem ist, dass der Operator ANY hier nicht benötigt wird. Wie Martin R. erwähnt, wird BELIEBIG mit vielen Beziehungen verwendet. Also, wenn Sie so etwas wie haben:

class Recipe 
{ 
    public String title; 
} 

class CookBook 
{ 
public Array recipes; 
} 

und Sie wollen, dass alle Kochbücher finden, die ein Rezept mit einem bestimmten Titel haben, dann würden Sie Prädikat verwenden:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY recipes.title CONTAINS[c] %@", @"sh"]; 

Wenn Sie wollen einfach nur die ganze Rezept Objekte, die zu Ihrem Titel passen, dann wird der ANY-Operator nicht benötigt. Verwenden Sie einfach:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title CONTAINS[c] %@", @"sh"]; 

Wenn Sie eine genaue Erklärung wollen lesen: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Predicates.pdf

Insbesondere achten Sie auf den Abschnitt „Verwendung von Prädikaten mit Key-Paths“. Hoffentlich hilft das.

+0

Schön erklärt, ich habe eine Frage hier, einfach davon ausgehen, dass Titel (zu eins) hat Array von receipes (zu viele), in diesem Fall müssen wir JEDEN haben oder nicht, da ich auch selten den Crash konfrontiert, wenn verwendet ANY in dieser Fall als (@ "ANY title.recipes. @ count> 0") – Bharath

Verwandte Themen