CoreData FetchRequest问题

时间:2016-02-15 05:42:18

标签: ios swift core-data nsfetchedresultscontroller

我教自己编程,并为自己学习了这个项目。我的代码出现问题,我能够正确保存并加载第一个州的TVC。但是,我对每个州TVC的动物状态和数量都有疑问。我希望按州来计算。因此,我会将狗和猫的数量加在一起并得到每个州的总数,但它会将Alabama分别带给两个不同的人群,有人可以帮我解决这个问题。

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

enter image description here

我的代码正在为第二个代码做的是它从coredata获取数据但是我使用排序描述符因为我不知道任何其他方式来提取数据。< / p>

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()

}

1 个答案:

答案 0 :(得分:1)

您的问题是获取的结果控制器不是为了显示您想要的聚合获取结果而设计的,因此您可以看到所有基础数​​据而不是聚合。

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

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

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

 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        android:paddingRight="42dp"
        android:paddingLeft="42dp"
        android:textSize="16sp"
        android:background="#E0E0E0"
        android:onClick="decrement"
        />