Ios CoreData NSFetchRequest返回结果,但对象的节数返回0
我目前正试图写我的第一个CoreData项目,我感到非常困惑。我正在使用以下代码设置获取结果控制器: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]
- (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,当数据被删除时,是否有任何理由不删除并释放它?你能把这个加在你的答案上吗?我可以接受。