CoreData FetchRequest 问题

CoreData FetchRequest problems

我正在自学编程,并想出了这个项目供自己学习。我的代码有问题,我能够正确保存它并加载第一个州人口 TVC。但是,我对每个州 TVC 的州和动物数量有疑问。我想按州计算总计。所以我会把狗和猫的数量加在一起,得到每个州的总数,但是它分别带来了阿拉巴马州和两个不同的人口,有人可以帮我解决这个问题吗。

下面的模型显示了我想要的方式,我能够正确输出到州人口,但现在是第二个。

我的代码对第二个代码所做的是它从 coredata 获取数据,但我使用的是排序描述符,因为我不知道任何其他方法来提取数据。

var totalEntries : Int = 0
let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var frc : NSFetchedResultsController = NSFetchedResultsController()

func fetchRequest() -> NSFetchRequest {
    let fetchRequest = NSFetchRequest(entityName: "Animals")
    let sortDescriptor = NSSortDescriptor(key: "state", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]
    return fetchRequest
}

func getFRC() -> NSFetchedResultsController {
    frc = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
    return frc
}

override func viewDidLoad() {
    super.viewDidLoad()

    frc = getFRC()
    frc.delegate = self

    do {
        try frc.performFetch()
    } catch {
        print("Failed to fetch data")
        return
    }
    totalEntries = moc.countForFetchRequest(fetchRequest(), error: nil) as Int!
    self.tableView.reloadData()


}

override func viewDidAppear(animated: Bool) {

    frc = getFRC()
    frc.delegate = self

    do {
        try frc.performFetch()
    } catch {
        print("Failed to fetch data")
        return
    }
    totalEntries = moc.countForFetchRequest(fetchRequest(), error: nil) as Int!
    self.tableView.reloadData()

}

您的问题是抓取结果控制器并非设计用于显示您想要的聚合抓取结果,因此您看到的是所有基础数​​据而不是聚合数据。

如果你作弊,你可以使用 FRC...将 FRC 的部分名称设置为州名称,然后你将在每个州的 table 中有一个部分。在 table 中委托 return 1 作为每个部分中的行数。配置单元格时,使用 KVC 对该状态下所有动物的种群进行@sum(FRC 理解的该部分的行)。

这是一个内存和运行时效率低下的解决方案...它可以通过缓存计算的总和来改进,但是你是在糟糕的设计之上添加逻辑。

正确的方法是放弃 FRC 并使用简单的字典数组。这将通过将您的获取请求更改为 return 字典类型并将其配置为为您计算总和来生成。这是用类似这样的表达式完成的:

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
expressionDescription.name = @"sumOfPopulations";
expressionDescription.expression = [NSExpression expressionForKeyPath:@"@sum.population"];
expressionDescription.expressionResultType = NSDecimalAttributeType;