【问题标题】:CoreData FetchRequest problemsCoreData FetchRequest 问题
【发布时间】:2016-02-15 05:42:17
【问题描述】:

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

下面的模型显示了我想要的效果,我能够正确输出到 State Population 但现在是第二个。

我的代码对第二个代码所做的是它从 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()

}

【问题讨论】:

  • 你需要提供一些关于你的代码实际在做什么的细节。
  • @TomHarrington 我正在使用排序描述符,但它没有添加人口,它只是在(州和每个州的动物数量)中两次说阿拉巴马州并给出了单独的人口。我想做的是把阿拉巴马州的人口加起来。
  • 你能添加你的获取请求代码吗?
  • @NileshMahajan 我做到了

标签: ios swift core-data nsfetchedresultscontroller


【解决方案1】:

您的问题是获取的结果控制器并非旨在显示您希望的聚合获取结果,因此您看到的是所有基础数​​据而不是聚合。

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

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

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

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

【讨论】:

  • 我将如何将人口与各州联系起来?
  • 使用第二种方法?字典将包含州名和总人口。你需要使用resultTypepropertiesToFetchpropertiesToGroupByIIRC
  • 好的,非常感谢,我会试试看,告诉你进展如何
  • 你如何帮助我让它快速运行。我一直在寻找那个具体的东西,但很快就找不到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多