Core data 在coredata中使用setPropertiesToFetch时,如何获取每个结果中的计数?

Core data 在coredata中使用setPropertiesToFetch时,如何获取每个结果中的计数?,core-data,Core Data,在我的应用程序中,我使用coredata存储一大组联系人。我需要知道所有的名字和他们的回应数量。 例如,如果数据集包含六个人:比尔·盖茨、比尔·乔丹、比尔·克林顿、迈克·乔丹、迈克·乔布斯、汤姆·克林顿。 我需要得到结果:比尔数到3,迈克数到2,汤姆数到1 如果我尝试这样做: [fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"firstName"]; [fetchRequest setResultType:NSDictio

在我的应用程序中,我使用coredata存储一大组联系人。我需要知道所有的名字和他们的回应数量。 例如,如果数据集包含六个人:比尔·盖茨、比尔·乔丹、比尔·克林顿、迈克·乔丹、迈克·乔布斯、汤姆·克林顿。 我需要得到结果:比尔数到3,迈克数到2,汤姆数到1

如果我尝试这样做:

[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"firstName"];
[fetchRequest setResultType:NSDictionaryResultType];

[managedObjectContext executeFetchRequest:fetchRequest error:nil];
然后我只能得到3本名为的字典。但是我记不清了。 如果我使用默认的结果类型,我将得到六个托管对象。迭代循环以获得第一个名称并计算其计数需要额外的时间成本

所以我的问题是,如何尽可能快地获取特定属性的值及其计数? 多谢各位


顺便说一下,我还尝试将
NSFetchResultController
与keyNamePath一起使用,并尝试获取部分信息。但是当有很多路段时,速度非常慢。这比我自己获得所有排序的managedObject并计算属性要慢得多。

你所说的大量联系人是什么意思?根据规模的不同,问题肯定不同

无论如何,使用数据库功能来很好地处理这个问题可能是值得的

Person
- firstName -> FirstName
- lastName -> LastName

FirstName
- name: string
- persons ->> Person

LastName
- name: string
- persons ->> Person
从这些实体(表)开始,更容易知道有多少人共享了多少姓名。尽管如此,对数据库的请求量还是相当大的,因此添加计数器可能会有很大帮助,同样:

FirstName
- name: string
- persons ->> Person
- personCount: integer

LastName
- name: string
- persons ->> Person
- personCount: integer
当然,您必须保持计数器的同步,但是无论条目数多少,都很容易获得所需的数据


(它甚至可能比一个简单的表占用更少的磁盘空间。)

非常感谢,添加新表和关系会有所帮助。但是,如果有许多属性需要获取和计算,我应该维护许多额外的表。因此,如果coredata的fetchquest提供了一个api来获取属性及其计数,我认为解决方案会更好。至于larget数据集,我在iPhone4中测试过,我有5000个managedObject和94个姓氏部分,使用NSFetchedResultController需要7.7秒。但是如果不使用节,只需要0.4秒。如果我循环排序的managedObject并将数据节为我自己,则需要3.1秒。但我认为,如果coredata可以直接获取属性及其计数,则可以减少3.1秒。