我目前正在尝试编写我的第一个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返回结果。
答案 0 :(得分:4)
除了@Levi建议的内容之外,您不应直接在_fetchedResultsController
(或其他表视图数据源方法)中访问实例变量numberOfRowsInSection
。始终使用属性访问者self.fetchedResultsController
。
原因:如果需要,fetchedResultsController
getter方法会创建获取的结果控制器。直接访问_fetchedResultsController
可能会返回nil
。
更新:另一个问题是获取的结果控制器缓存。来自文档:
重要提示:如果您使用的是缓存,则必须致电 在更改任何获取请求之前
deleteCacheWithName:
谓词或其排序描述符。你不能重复使用它 除非您设置了,否则为多个查询提取结果控制器cacheName
至nil
。
...
在可能的情况下,控制器使用缓存来避免重复执行工作的需要 设置任何部分并订购内容。缓存在应用程序启动时保持不变。
因此,您应该使用cacheName:nil
或确保在更改FRC的任何参数时删除缓存。
答案 1 :(得分:1)
在方法的return _fetchedResultsController;
行之前,告诉NSFerchedResultsController
执行请求:
[self.fetchedResultsController performFetch:NULL];