一些背景信息: 我正在从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