2014-06-17 20 views
6

Ứng dụng tôi vừa thực hiện đã bị đổ vỡ vào các thời điểm ngẫu nhiên với "Phía bên trái của toán tử ALL hoặc ANY phải là một Lỗi NSArray hoặc NSSet ".Phía bên tay trái của một toán tử ALL hoặc ANY phải là NSArray hoặc NSSet

Ứng dụng khi gặp sự cố đang cố gắng đọc từ Dữ liệu chính. Nó không sụp đổ tất cả các thời gian, chỉ ngẫu nhiên. Tôi không chắc liệu PREDICATE của nó có gây ra vấn đề hoặc hai luồng truy cập Core Data không? Nếu đó là PREDICATE, tôi sẽ nghĩ rằng nó sẽ sụp đổ mỗi lần. Của họ đã được một số di cư đến cấu trúc db vì vậy có lẽ một trong những di cư đã để lại một đối tượng trong một trạng thái kỳ lạ và sụp đổ của nó khi đối tượng đó được lấy bởi Core Data?

Sau đây là các vị gọi

+(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"]]; 
} 

PHƯƠNG PHÁP === Ở ĐÂU nó đâm ======

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

...... 

} 

=== ĐÂY LÀ STACK CALL ====

*** 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

Vị từ có chứa toán tử "ALL hoặc ANY" trông như thế nào? –

+0

Bạn tạo một số biến vị ngữ (sử dụng các phương thức chưa biết như buildCompoundContainsStringForField), do đó, không rõ ràng (với tôi) mà vị từ hoặc tìm nạp yêu cầu gây ra sự cố. - Có lẽ bạn có thể đặt "Điểm ngắt ngoại lệ" và sau đó yêu cầu 'po' trong bảng điều khiển trình gỡ lỗi khi xảy ra sự cố. Ngoài ra thông tin về các thực thể và các mối quan hệ sẽ hữu ích. –

+0

Nguyên nhân gây ra bởi vị từ TITLE BẤT CỨ tiêu đề CONTAINS [c] "sh" cũng sẽ cập nhật bài đăng gốc và bao gồm phương thức đó. – jdog

Trả lời

7

Vấn đề là nhà điều hành BẤT K is là không cần thiết ở đây. Như Martin R đã đề cập, BẤT CỨ được sử dụng với nhiều mối quan hệ. Vì vậy, nếu bạn có một cái gì đó như:

class Recipe 
{ 
    public String title; 
} 

class CookBook 
{ 
public Array recipes; 
} 

và bạn muốn tìm tất cả các sách dạy nấu ăn có một Recipe với một tiêu đề nhất định sau đó bạn sẽ sử dụng ngữ:

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

Nếu bạn chỉ muốn tất cả các Recipe các đối tượng khớp với tiêu đề của bạn thì không cần đến toán tử BẤT CỨ. Chỉ cần sử dụng:

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

Nếu bạn muốn có một lời giải thích sâu hơn đọc: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/Predicates.pdf

Đặc biệt, chú ý đến phần "Sử dụng vị từ với Key-Paths". Hy vọng rằng sẽ giúp.

+0

Được giải thích rõ ràng, tôi có một truy vấn ở đây, Chỉ cần giả định rằng tiêu đề (cho một) có mảng biên nhận (cho nhiều), trong trường hợp này chúng ta cần có BẤT K or hay không, vì tôi cũng phải đối mặt với sự cố hiếm khi được sử dụng BẤT K in trường hợp này là (@ "ANY title.recipes. @ count> 0") – Bharath

Các vấn đề liên quan