SIGBART on [[NSFetchedResultsController alloc] initWithFetchRequest

时间:2012-07-02 23:39:18

标签: iphone ios nsfetchedresultscontroller

我在代码中收到此行的sigbart错误:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"ViewTwo"];

这是方法:

- (NSFetchedResultsController *)fetchedResultsController
{
if (__fetchedResultsController != nil) {
    return __fetchedResultsController;
}

// Set up the fetched results controller.
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyData" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"ViewTwo"];

aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

return __fetchedResultsController;
}

但这是一个奇怪的错误,因为在控制台中没有给我任何解释,所以我无法理解我做错了什么。

3 个答案:

答案 0 :(得分:5)

NSFetchedResultsController需要排序描述符和托管对象上下文。你没有提供排序描述符,所以你必须给它。

答案 1 :(得分:0)

奇怪的是,SIGBART没有输出,请尝试运行指令(按步骤查看是否输出。

您需要做的是检查您发送给方法的每个元素(通过记录),在调用执行之前,其中一个元素实际上可能是nil或被解除引用。

答案 2 :(得分:0)

您可以修改xcdatamodled,但不会在设备上重新安装您的应用。

只需删除您设备上构建的应用并重新构建,一切都会正常。

这就是苹果所说的:

abort()会导致应用程序生成崩溃日志并终止。您不应在运输应用程序中使用此功能,尽管它在开发期间可能很有用。

此处出现错误的典型原因包括:  *持久性商店无法访问;  *持久性存储的架构与当前的托管对象模型不兼容。  检查错误消息以确定实际问题是什么。

如果无法访问持久性存储,则文件路径通常有问题。通常,文件URL指向应用程序的资源目录而不是可写目录。

如果在开发过程中遇到架构不兼容错误,可以通过以下方式降低频率:  *只需删除现有商店:

 [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]
  • 通过将以下字典作为options参数传递来执行自动轻量级迁移:

     [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    

    轻量级迁移仅适用于一组有限的架构更改;有关详细信息,请参阅“核心数据模型版本控制和数据迁移编程指南”。