Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData NSFetchRequest返回结果,但对象的节数返回0_Ios_Xcode_Core Data_Nsfetchedresultscontroller_Nsfetchrequest - Fatal编程技术网

Ios CoreData NSFetchRequest返回结果,但对象的节数返回0

Ios CoreData NSFetchRequest返回结果,但对象的节数返回0,ios,xcode,core-data,nsfetchedresultscontroller,nsfetchrequest,Ios,Xcode,Core Data,Nsfetchedresultscontroller,Nsfetchrequest,我目前正试图写我的第一个CoreData项目,我感到非常困惑。我正在使用以下代码设置获取结果控制器: - (NSFetchedResultsController *)fetchedResultsController { if (_fetchedResultsController != nil) return _fetchedResultsController; Singleton *singleton = [Singleton sharedSingleton]

我目前正试图写我的第一个CoreData项目,我感到非常困惑。我正在使用以下代码设置获取结果控制器:

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil)
        return _fetchedResultsController;

    Singleton *singleton = [Singleton sharedSingleton];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"MapEntity" inManagedObjectContext:[singleton managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"sName" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:8];

    // Finally check the results
    NSError *error;
    NSArray *fetchedObjects = [[singleton managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    for (MapEntity *map in fetchedObjects)
    {
        NSLog(@"Maps present in database: %@", map.sName);
    }


    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[singleton managedObjectContext] sectionNameKeyPath:nil cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}
我输入了NSLog以查看fetchRequest是否正在查找结果,它确实:

2013-01-28 11:20:14.735 WildMap_iOS[10931:16a03] Maps present in database: UK Capital Cities
2013-01-28 11:20:14.736 WildMap_iOS[10931:16a03] Maps present in database: The UK
2013-01-28 11:20:14.736 WildMap_iOS[10931:16a03] Maps present in database: Testing123
2013-01-28 11:20:14.736 WildMap_iOS[10931:16a03] Maps present in database: TestForPic
2013-01-28 11:20:14.736 WildMap_iOS[10931:16a03] Maps present in database: Scottish Map
2013-01-28 11:20:14.736 WildMap_iOS[10931:16a03] Maps present in database: Old Scotland
2013-01-28 11:20:14.736 WildMap_iOS[10931:16a03] Maps present in database: Old Scotland
2013-01-28 11:20:14.737 WildMap_iOS[10931:16a03] Maps present in database: Old Scotland
2013-01-28 11:20:14.737 WildMap_iOS[10931:16a03] Maps present in database: Field Concatination
但是,当我尝试使用fetchedResultsController设置tableView numberOfRowsInSection时,如下所示:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section];

    return [sectionInfo numberOfObjects];
}
“return[sectionInfo numberOfObjects];”返回nil,即使fetchRequest似乎很好地拾取了对象

我很好地使用了这段代码,但是最近我在mapEntity(iID)中添加了一个整数,它使我删除了模拟器数据,因为存储数据的结构已经改变。在我删除数据并重新启动应用程序后,代码不再工作


有人能帮我理解为什么会这样吗?我认为它不像以前那样使用命名约定,fetchRequest正在返回结果。

返回之前\u fetchedResultsController行在方法中,告诉NSFerchedResultsController执行请求:

[self.fetchedResultsController performFetch:NULL];

除了@Levi建议的之外,您不应该直接在
numberofrowsinssection
中(或在其他表视图数据源方法中)访问实例变量
\u fetchedResultsController
。始终使用属性访问器
self.fetchedResultsController

原因:必要时,
fetchedResultsController
getter方法会创建fetchedResultsController。直接访问
\u fetchedResultsController
可能会返回
nil

更新:另一个问题是获取的结果控制器缓存。从文件中:

重要提示:如果使用缓存,则必须调用
deleteCacheWithName:
在更改任何提取请求之前,其 谓词或其排序描述符。不能重复使用相同的 获取多个查询的结果控制器,除非设置
cacheName
nil


在可能的情况下,控制器使用缓存以避免重复在中执行的工作 设置任何部分并对内容进行排序。缓存在应用程序的启动过程中进行维护


因此,您应该使用
cacheName:nil
或确保在FRC的任何参数更改时删除缓存。

这仍然返回nil,这是否意味着提取有问题?啊,好的,我已更改代码以反映这一点,但它仍然不起作用。我一直在检查_fetchedResultsController是否有效,它是否有效。当我打印出“[[self.fetchedResultsController sections]objectAtIndex:0]”时,sections参数仍然为零。您可以记录
[self.fetchedResultsController FetchedObject]
的内容吗?您也可以在创建FRC时尝试
缓存名称:nil
,以避免出现错误缓存数据的问题。可以,它列出了所有地图实体及其相关数据。这很奇怪,它正在查找条目,但它不会在部分中返回数字。耶,谢谢!它是cacheName,当数据被删除时,是否有任何理由不删除并释放它?你能把这个加在你的答案上吗?我可以接受。