一些背景信息:我正在从 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 个结果。我的 Rails 服务器上的(巧合..?)相同的 3 个结果。
我手动打开数据库并编辑了一些“重复”记录,以检查它是否进行了一些神奇的重复检查,而我手动编辑的记录仍然没有显示。在这一点上,我迷路了。什么可能导致结果被过滤掉?代码首先不应该知道这些模型是重复的。我只是不明白。
编辑 - -
更多信息:
我的 TableViewController 是 Standford 提供的 CoreDataTableViewController 的子类(附带的讲座视频可在 iTunes U 上找到,顺便说一句,非常棒): http: //www.stanford.edu/class/cs193p/cgi-bin/drupal /downloads-2011-fall (用于 CoreDataTableViewController.zip 的 ctrl+f)
这performFetch
在 fetchedResultsController 属性设置器上分配后处理并简单地调用
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];
}
在数据控制器中:
- (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