0

在我的应用程序中,我使用 coredata 来存储大量联系人。我需要知道所有名字及其响应计数。例如,如果数据集包含六个人:比尔盖茨、比尔乔丹、比尔克林顿、迈克乔丹、迈克乔布斯、汤姆克林顿。我需要得到结果:Bill 计数为 3,Mike 计数为 2,Tom 计数为 1。

如果我试试这个:

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

[managedObjectContext executeFetchRequest:fetchRequest error:nil];

然后我只能得到 3 个具有名字值的字典。但我无法计数。如果我使用默认结果类型,我将获得六个托管对象。迭代循环以获取名字并计算其计数需要额外的时间成本。

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

顺便说一句,我也尝试使用NSFetchResultControllerkeyNamePath,并尝试获取部分信息。但是当有很多部分时,速度很慢。它比我得到所有排序的 managedObject 并自己计算属性要慢。

4

1 回答 1

0

大量联系人是什么意思?根据规模,问题肯定不一样。

不管怎样,使用数据库功能来很好地处理这个问题可能是值得的。

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

当然,您必须保持计数器同步,但是无论条目数量如何,都可以很容易地获得所需的数据。

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

于 2012-06-28T13:34:31.103 回答