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

Ell*_*rez 5 xcode core-data nsfetchedresultscontroller nsfetchrequest ios

我目前正在尝试编写我的第一个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;
}
Run Code Online (Sandbox Code Playgroud)

我放入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
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用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];
}
Run Code Online (Sandbox Code Playgroud)

'返回[sectionInfo numberOfObjects];' 返回零,即使fetchRequest似乎可以很好地拾取对象。

我使用的代码很好,但是最近我向mapEntity(iID)添加了一个整数,由于存储数据的结构发生了变化,这使我删除了模拟器数据。在删除数据并重新启动应用程序后,代码不再起作用。

谁能帮助我了解为什么会这样?我不认为这是以前的命名约定,并且fetchRequest返回结果。

Mar*_*n R 5

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

原因fetchedResultsController如果需要,getter方法将创建获取的结果控制器。_fetchedResultsController直接访问可能会返回nil

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

重要提示:如果您正在使用缓存,则必须deleteCacheWithName:在更改任何获取请求,其谓词或其排序描述符之前进行调用 。除非将设置为cacheName,否则不得将相同的提取结果控制器重复用于多个查询 nil
...
在可能的情况下,控制器使用高速缓存来避免重复设置任何部分和排序内容所执行的工作。缓存在应用程序的所有启动之间维护。

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

  • 您也可以在创建FRC时尝试使用“ cacheName:nil”,以避免出现缓存数据错误的问题。 (2认同)