修改 NSFetchRequest 为空数组生成 NSRangeException 索引 0 超出范围

Posted

技术标签:

【中文标题】修改 NSFetchRequest 为空数组生成 NSRangeException 索引 0 超出范围【英文标题】:Modifying NSFetchRequest generating NSRangeException index 0 beyond bounds for empty array 【发布时间】:2013-06-01 00:51:56 【问题描述】:

在我最新的 ios 应用更新中,我发现与数据库相关的崩溃显着增加。我看到几乎每一行在数据库上运行提取的代码都会崩溃。

例外: NSRangeException* -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array

堆栈跟踪:

CoreFoundation 0x32c982a3 __exceptionPreprocess + 163 1 libobjc.A.dylib 0x3a93d97f objc_exception_throw + 31 2 核心基础 0x32be3b75 -[__NSArrayM objectAtIndex:] + 165 3 CoreData 0x32a4227f -[NSSQLCore _newRowsForFetchPlan:selectedBy:withArgument:] + 2007 4 CoreData 0x32a3b089 -[NSSQLCore newRowsForFetchPlan:] + 313 5 CoreData 0x32a3a73f -[NSSQLCore objectsForFetchRequest:inContext:] + 683 6 CoreData 0x32a3a205-[NSSQLCore 执行请求:withContext:错误:] + 469 7 CoreData 0x32a3961d-[NSPersistentStoreCoordinator 执行请求:withContext:错误:] + 1645 8 CoreData 0x32a37f17 -[NSManagedObjectContext executeFetchRequest:error:] + 647 9 MyApp 0x000516b7 +[DBQuery searchObjectsWithEntityName:::::] + 211 10 MyApp 0x000515a1 + [DBQuery 同步数据] + 113 11 MyApp 0x0006a7f7 __14+[MyAppSync 同步]_block_invoke + 39 12 libdispatch.dylib 0x3ad5511f _dispatch_call_block_and_release + 11 13 libdispatch.dylib 0x3ad63259 _dispatch_root_queue_drain + 261 14 libdispatch.dylib 0x3ad633b9 _dispatch_worker_thread2 + 85 15 libsystem_c.dylib 0x3ad89a11 _pthread_wqthread + 361 16 libsystem_c.dylib 0x3ad898a4 start_wqthread + 8

看起来罪魁祸首的代码行可能与我的 NSFetchRequest 添加两行修改有关:

+ (NSFetchRequest*) getFetchRequestForEntityName:(NSString*)entityName :(NSPredicate*)predicate :(NSString*)sortKey :(BOOL)sortAscending :(int)limit :(NSManagedObjectContext*)managedObjectContext NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]; [request setEntity:entity];

[request setFetchLimit:limit];

//* 最新版本中的新功能**//

[request setIncludesPropertyValues:NO];
[request setReturnsObjectsAsFaults:NO];

//**************//

if(predicate != nil)

    [request setPredicate:predicate];


// If a sort key was passed, use it for sorting.
if(sortKey != nil)

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:sortAscending];
    NSArray *sortDescriptors = @[sortDescriptor];
    [request setSortDescriptors:sortDescriptors];


return request;

【问题讨论】:

【参考方案1】:

删除添加的两条线解决了问题。

[request setIncludesPropertyValues:NO]; [request setReturnsObjectsAsFaults:NO];

【讨论】:

在 iOS10 上我出现了这个错误,而在 iOS9 上它工作正常。删除这两条线中的任何一条都可以修复它...

以上是关于修改 NSFetchRequest 为空数组生成 NSRangeException 索引 0 超出范围的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController,修改NSFetchRequest?

基于数组属性大小的 NSFetchRequest

NSFetchRequest 返回具有 <invalid> 类型元素的数组

带有 NSPredicate 的 NSFetchRequest 不返回任何结果

NSFetchRequest 用于行中的子对象

iPhone 核心数据:具有不同属性和字母部分的 NSFetchRequest