NSFetchedResultsController未显示所有结果

时间:2012-10-09 11:00:06

标签: ios core-data uitableview nsfetchedresultscontroller

一些背景信息: 我正在从Ruby on Rails网站上获取数据,解析它的json,并将对象分配给Core Data对象。这很好用,并且行导入正常,但它尚未检查重复项(我还没有实现)。因此,每次启动应用程序时,我都会额外添加3个对象。

我已设置NSFetchedResultsController来获取模型的所有对象:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([self class])];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"remote_id" ascending:YES]];
return [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

并且在我的表控制器中,我添加了所有方法来将数据从FetchedResultsController中提取到表委托方法中。

问题本身是,当执行NSFetchRequest时,我会返回数组中的所有对象(目前大约有60个),但该表只显示3个结果。 (巧合......?)同样的3个结果在我的rails服务器上。

我手动打开了数据库并编辑了一些“重复”记录,以检查它是否正在进行一些神奇的重复检查,而我的手动编辑的记录仍未显示。此时我迷失了。什么可能导致结果过滤?代码不应该首先意识到这些模型是重复的。我只是没有 理解。

编辑----

更多信息:

我的TableViewController是Standford提供的CoreDataTableViewController的子类(附带的讲座视频可以在iTunes U上找到,顺便说一下,这很棒): http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2011-fall (ctrl + f for CoreDataTableViewController.zip)

在fetchedResultsController属性setter上赋值后,它处理performFetch 并简单地调用

NSError *error;
[self.fetchedResultsController performFetch:&error];
if (error) NSLog(@"[%@ %@] %@ (%@)", NSStringFromClass([self class]),  NSStringFromSelector(_cmd), [error localizedDescription], [error localizedFailureReason]);
//...
[self.tableView reloadData];

以及节和行计数(返回1和3):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [[self.fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}

并在cellForRowAtIndexPath我只是调用以下内容来检索每个对象

id myObject = [self.fetchedResultsController objectAtIndexPath:indexPath]

编辑2 -----好的,这是实际的代码,而不是我挑选的部分:

在我的Registration+sync.m

+ (NSFetchRequest*)requestForAll {
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([self class])];
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"remote_id" ascending:YES]];
    return request;
}

+ (NSFetchedResultsController*)requestForAllResultsController {
    NSFetchRequest *request = [self requestForAll];
    NSManagedObjectContext *context = [DataController instance].database.managedObjectContext;
    return [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
}

+ (NSArray*)allObjects {
    NSFetchRequest *request = [self requestForAll];
    return [[DataController instance] fetch:request];
}

在DataController中:

- (NSArray*)fetch:(NSFetchRequest*)request {
    NSManagedObjectContext *context = self.database.managedObjectContext;
    NSError *error = nil;
    return [context executeFetchRequest:request error:&error];
}

在TableViewController中:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"rows: %d", [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects]);
    NSLog(@"all objects: %d", [[Registration allObjects] count]);
    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}

打印出以下内容:

2012-10-09 15:22:04.211 MyApp[8279:c07] rows: 4
2012-10-09 15:22:04.214 MyApp[8279:c07] all objects: 68

0 个答案:

没有答案