2015-04-15 92 views
0

当我在IOS 8.3执行这行代码这一行崩溃:iOS的碰撞与核心数据

NSArray *results = [self executeFetchRequest:request inContext:context]; 

这里是失败的全部功能:

+ (id) executeFetchRequestAndReturnFirstObject:(NSFetchRequest *)request inContext:(NSManagedObjectContext *)context 
{ 
    [request setFetchLimit:1]; 

    NSArray *results = [self executeFetchRequest:request inContext:context]; 
    if ([results count] == 0) 
    { 
     return nil; 
    } 
    return [results objectAtIndex:0]; 
} 

上述函数的调用:

+ (id)findFirstByAttribute:(NSString *)attribute withValue:(id)searchValue inContext:(NSManagedObjectContext *)context 
{ 
    NSFetchRequest *request = [self requestFirstByAttribute:attribute withValue:searchValue inContext:context]; 
    [request setPropertiesToFetch:[NSArray arrayWithObject:attribute]]; 

    return [self executeFetchRequestAndReturnFirstObject:request inContext:context]; 
} 

值得注意的是,我非常新到iOS编程,所以请去容易对我来说,这个问题可能不是最好的,可能没有太多的后盾代码,但这是由于我在iOS中缺乏知识。我的Android的问题通常比这更好的:P如果我能够添加任何更多的细节,我会尽我所能增加更多,崩溃日志低于

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Bad fetch request (NSManagedObjectResultType not compatible with contents of propertiesToFetch)' * First throw call stack: ( 0 CoreFoundation 0x0000000111d7dc65 exceptionPreprocess + 165 1 libobjc.A.dylib
0x0000000110fafbb7 objc_exception_throw + 45 2 CoreData
0x00000001112ecb6e -[NSSQLGenerator newSQLStatementForRequest:ignoreInheritance:countOnly:nestingLevel:] + 1646 3 CoreData 0x00000001112d8dc4 -[NSSQLAdapter _statementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 244 4 CoreData 0x00000001111f0e0c -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 316 5 CoreData 0x00000001111f0a86 -[NSSQLCore newRowsForFetchPlan:] + 118 6 CoreData 0x00000001111f033c -[NSSQLCore objectsForFetchRequest:inContext:] + 524 7 CoreData 0x00000001111efdbb -[NSSQLCore executeRequest:withContext:error:] + 299 8 CoreData 0x00000001112caa6c __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 3356 9 CoreData
0x00000001112d3c30 gutsOfBlockToNSPersistentStoreCoordinatorPerform + 192 10 libdispatch.dylib 0x0000000114e29614 _dispatch_client_callout + 8 11 libdispatch.dylib 0x0000000114e0f002 _dispatch_barrier_sync_f_invoke + 365 12 CoreData 0x00000001112c5245 _perform + 197 13 CoreData
0x00000001111efa58 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 504 14 CoreData
0x00000001111ee2ca -[NSManagedObjectContext executeFetchRequest:error:] + 586 15 HawkExpress
0x000000010e52438e +[NSManagedObject(MagicalRecord) executeFetchRequest:inContext:] + 62 16 HawkExpress
0x000000010e52446e +[NSManagedObject(MagicalRecord) executeFetchRequestAndReturnFirstObject:inContext:] + 78 17 HawkExpress 0x000000010e5261fc +[NSManagedObject(MagicalRecord) findFirstByAttribute:withValue:inContext:] + 140 18 HawkExpress
0x000000010e526274 +[NSManagedObject(MagicalRecord) findFirstByAttribute:withValue:] + 100 19 HawkExpress
0x000000010e52aa54 +[FavouritesManager doesFavouriteExist:] + 84 20 HawkExpress 0x000000010e4de4a7 -[BookCabViewController tableView:cellForRowAtIndexPath:] + 2087 21 UIKit 0x00000001124b9a28 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 508 22 UIKit 0x0000000112498248 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2853 23 UIKit 0x00000001124ae8a9 -[UITableView layoutSubviews] + 210 24 UIKit
0x0000000112438a2b -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 536 25 QuartzCore 0x000000010fdfbec2 -[CALayer layoutSublayers] + 146 26 QuartzCore 0x000000010fdf06d6 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380 27 QuartzCore 0x000000010fdf0546 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 28 QuartzCore 0x000000010fd5c886 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242 29 QuartzCore 0x000000010fd5da3a _ZN2CA11Transaction6commitEv + 462 30 QuartzCore 0x000000010fd5e0eb _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89 31 CoreFoundation 0x0000000111cb0ca7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION
+ 23 32 CoreFoundation 0x0000000111cb0c00 __CFRunLoopDoObservers + 368 33 CoreFoundation 0x0000000111ca6a33 __CFRunLoopRun + 1123 34 CoreFoundation
0x0000000111ca6366 CFRunLoopRunSpecific + 470 35 GraphicsServices
0x0000000114a34a3e GSEventRunModal + 161 36 UIKit
0x00000001123b8900 UIApplicationMain + 1282 37 HawkExpress
0x000000010e4baa23 main + 99 38 libdyld.dylib
0x0000000114e5d145 start + 1) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

+3

我认为你的问题的标题可能会更好;它将所有与Core Data有关的事情都做了,而与NSArray没有多大关系。 – trojanfoe

+0

随时更改它或让我知道它应该是什么,因为我在问题中说,iOS不是我的领域,我不知道发生了什么 – apmartin1991

+0

问题在这部分,请发布代码> >>> NSFetchRequest * request = [self requestFirstByAttribute:attribute withValue:searchValue inContext:context]; [request setPropertiesToFetch:[NSArray arrayWithObject:attribute]]; – hummingV

回答

1

您需要检查NSArray的结果是零之前,你可以做一个计数。

if (array != nil) { 
    NSUInteger count = [array count]; // May be 0 if the object has been deleted. 
    // 
} 
else { 
    // Deal with error. 
} 

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html

+0

你呢?从什么时候Objective-C关心通过一个'nil'对象指针发送消息? – trojanfoe

+0

这个答案不会帮助,当我在这里创建一个数组时失败:NSArray * results = [self executeFetchRequest:request inContext:context];不是当我做一个计数 – apmartin1991

+0

您是否设置了请求实体? NSEntityDescription * entity = [NSEntityDescription entityForName:@“Event”inManagedObjectContext:context]; [request setEntity:entity]; –

0

试图注释掉该行[request setPropertiesToFetch:[NSArray arrayWithObject:attribute]];

“坏取得请求(NSManagedObjectResultType不propertiesToFetch的内容兼容)”手段,你似乎期望默认NSFetchRequestResultTypeNSManagedObjectResultType)。但是您请求不要获取完整的实体,但只需要提供ONE属性(为什么,顺便说一下,您的方法提供了预期值,并且只提供了一个要获取的属性)。

我解决了这个:

- (id)findEntityNamed:(NSString*)entity withKeyPath:(NSString*)path equalTo:(id)value 
{ 
    NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:entity 
            inManagedObjectContext:context]]; 

    NSPredicate* predicate = 
    [NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:path] 
            rightExpression:[NSExpression expressionForConstantValue:value] 
              modifier:NSDirectPredicateModifier 
               type:NSEqualToPredicateOperatorType 
              options:0]; 

    [fetchRequest setPredicate:predicate]; 
    [fetchRequest setFetchLimit:1];   // ONLY 1 OBJECT IS FETCHED! 

    NSError* err = nil; 
    NSArray* results = [context executeFetchRequest:fetchRequest error:&err]; 
    [fetchRequest release]; 

    if(err) 
    { 
     // do logging stuff etc. 
    } 

    if([results count] < 1) 
     return nil; 

    return [results lastObject]; 
} 

你可以试试这个,并告诉我们,如果这更像是你一直在寻找

0

你NSFetchRequest对象可能无法正确构建。

这是一个有效的NSFetchRequest示例。通过google搜索“NSFetchRequest示例”可以找到更多。

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", aTitle]; //<----- (a) 
[request setEntity:[NSEntityDescription entityForName:@"Person" inManagedObjectContext:moc]]; 
[request setPredicate:predicate]; 

要小心,在(A),该字符串必须严格遵循谓词格式字符串模式(见NSPrediate类的引用),名称必须是个人实体的财产在你的管理对象模型

而问题在于这部分

NSFetchRequest *request = [self requestFirstByAttribute:attribute withValue:searchValue inContext:context]; 
[request setPropertiesToFetch:[NSArray arrayWithObject:attribute]]; 

因此,如果仍未解决,请发布方法[self requestFirstByAttribute ...]的代码。