Core Data 属性计数并在 TableView 中显示结果
Posted
技术标签:
【中文标题】Core Data 属性计数并在 TableView 中显示结果【英文标题】:Core Data attribute count and show the result in a TableView 【发布时间】:2012-05-08 10:11:16 【问题描述】:我有一个名为 Car 的实体,它具有 2 个属性:name 和 color。
我在数据库中有几辆车:
名称:本田思域
颜色:蓝色
名称:大众高尔夫
颜色:蓝色
名称:雷诺 Twingo
颜色:红色
名称:雪佛兰科迈罗
颜色:白色
现在我需要计算每种颜色的汽车数量,然后将结果放入 UITableView。
所以,例如,在 TableView 中会有:
蓝色 (2)
红色 (1)
白色 (1)
想象一下大约有 70 种不同的颜色。
我搜索了很多Core Data的网站和书籍,但我仍然不知道这是否可能。
有可能吗?如果可以,怎么做?
【问题讨论】:
【参考方案1】:这些是简单的提取。其实你可以用一个NSFetchedResultsController,把“color”设置为节名,它会返回给你一个所有对象的数组,它们会按颜色分组。
类似...
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Car"];
NSSortDescriptor *sectionSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"color" ascending:YES];
NSSortDescriptor *nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sectionSortDescriptor, nameSortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"color" cacheName:@"CarCache"];
fetchedResultsController.delegate = self;
self.fetchedResultsController = fetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error])
// Handle error...
现在,您的数据将分为多个部分,每种颜色一个部分,其中的值按名称排序。要获取数据,只需查看 FRC 的 section 属性即可。
【讨论】:
【参考方案2】:我认为前面的答案不太正确。在您获取的结果控制器中,您执行通常的操作,但是
您获取实体Color
您按name
(即颜色名称)排序
在cellForRowAtIndexPath:
中,您构建了要显示的适当字符串。
Color *color = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"%@ (%d)",
color.name, color.cars.count];
其中cars
是从颜色到汽车的反向关系的名称。
【讨论】:
以上是关于Core Data 属性计数并在 TableView 中显示结果的主要内容,如果未能解决你的问题,请参考以下文章
Core Data 轻量级迁移 - 现有实体是不是添加了新属性?
SwiftUI从Core Data实体中获取总项目(SQL术语中的行)计数[重复]
在 Core Data 之外重用 NSManagedObject 的结构