gpt4 book ai didi

ios - 按一个属性分组,同时使用核心数据检索更多属性

转载 作者:可可西里 更新时间:2023-11-01 03:31:40 26 4
gpt4 key购买 nike

我在 Core Data 中有一个具有以下属性的表:

date, name, phone

我想检索一个包含 5 个唯一电话号码的列表,这些电话号码的名称按日期排序。所以在 MySQL 中它会是这样的:

SELECT name, phone FROM myTable GROUP BY phone ORDER BY date   

所以如果我有这个数据列表:

01/23/2015 someName1 12345678
01/21/2015 someName2 12345678
01/21/2015 someOtherName1 987654321

我想检索一个唯一电话号码列表,其中日期字段控制哪个名称与任何重复号码相关联。在这种情况下,期望的结果将是:

01/23/2015 someName1 12345678
01/21/2015 someOtherName1 987654321

然而,使用 NSFetchRequest 执行此操作似乎有点复杂,因为 setPropertiesToGroupBy 需要包含与 setPropertiesToFetch 中定义的相同的属性列表。

换句话说,这就是我认为我能够做到的方式:

    NSEntityDescription *entity = [NSEntityDescription  entityForName:@"someEntity" inManagedObjectContext:someContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];

[request setPropertiesToFetch:@[@"name", @"phone"]];
[request setPropertiesToGroupBy:@[@"phone"]];
[request setFetchLimit:5];

NSSortDescriptor *sortByCreatedDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[request setSortDescriptors:@[sortByCreatedDate]];

但是,除非我也包含 name 字段,否则我将在 propertiesToGroupBy 上获得异常。

如何在不手动浏览列表的情况下实现我想要的?

最佳答案

附带条件是我认为这会起作用;我把它留给你去测试它:

除了 propertiesToGroupBy 中的属性外,您不能向 propertiesToFetch 添加任何其他属性,但您似乎可以在属性中包含 objectID获取。为此,为“评估对象”构建一个 NSExpression 和关联的 NSExpressionDescription:

NSExpression *selfExp = [NSExpression expressionForEvaluatedObject];
NSExpressionDescription *selfED = [[NSExpressionDescription alloc] init];
selfED.name = @"objID";
selfED.expression = selfExp;
selfED.expressionResultType = NSObjectIDAttributeType;

现在定义另一个表达式/描述来获取最大值(日期):

NSExpression *maxDate = [NSExpression expressionForKeyPath:@"date"];
NSExpression *indexExp = [NSExpression expressionForFunction:@"max:" arguments:@[maxDate]];
NSExpressionDescription *maxED = [[NSExpressionDescription alloc] init];
maxED.name = @"maxDate";
maxED.expression = indexExp;
maxED.expressionResultType = NSDateAttributeType;

然后将这两个表达式描述包含在要获取的属性列表中:

[request setPropertiesToFetch:@[@"phone", maxED, selfED]];
[request setPropertiesToGroupBy:@[@"phone"]];

当您运行提取时,结果数组中的每一项都会有一个键“objID”,其中包含相关对象的对象 ID。您可以解压它,以访问姓名、电话等,使用以下内容:

NSArray *results = [self.context executeFetchRequest:request error:&error];
for (NSDictionary *dict in results) {
NSDate *maxDate = dict[@"maxDate"];
NSString *phone = dict[@"phone"];
NSManagedObjectID *objID = [dict valueForKey:@"objID"];
NSManagedObject *object = [self.context objectWithID:objID];
NSString *name = [object valueForKey:@"name"];
}

我不确定的一个特定方面是,如果两行具有完全相同的 date,这将如何表现。

关于ios - 按一个属性分组,同时使用核心数据检索更多属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28136282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com