0

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

0 回答 0