我在核心数据中有开始日期属性,并且我想根据startDate获取与分组一起的项,
但是startDate基本上有timeComponent,但是我希望分组是基于yyyy的,
,这是我使用的代码
NSError *error = nil;
NSFetchRequest *request = [NSFetchRequest new];
NSManagedObjectContext *context = self.managedObjectContext;
request.entity = [CalendarItem entityInManagedObjectContext:context];
NSExpression *startExpr = [NSExpression expressionForKeyPath:@"start"];
NSExpression *countExpr = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:startExpr]];
NSExpressionDescription *exprDesc = [[NSExpressionDescription alloc] init];
[exprDesc setExpression:countExpr];
[exprDesc setExpressionResultType:NSInteger64AttributeType];
[exprDesc setName:@"count"];
[request setPropertiesToGroupBy:@[@"start"]];
[request setPropertiesToFetch:[NSArray arrayWithObjects:@"start", exprDesc, nil]];
[request setResultType:NSDictionaryResultType];
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];,这是我得到的输出:
Printing description of results:
<_PFArray 0x600001e3a700>(
{
count = 1;
start = "2021-09-14 03:30:00 +0000";
},
{
count = 1;
start = "2021-09-14 04:00:00 +0000";
},
{
count = 1;
start = "2021-09-16 09:30:00 +0000";
},
{
count = 1;
start = "2021-11-11 00:00:00 +0000";
},
{
count = 1;
start = "2021-11-11 04:00:00 +0000";
},
{
count = 1;
start = "2021-11-11 06:00:00 +0000";
},
{
count = 1;
start = "2021-11-12 00:00:00 +0000";
}
)预期结果:
{
count = 2
start = 2021-09-14
}
{
count = 1
start = 2021-09-16
}
{
count = 3
start = 2021-11-11
}
{
count = 1;
start = "2021-11-12
}发布于 2021-11-12 18:10:12
您已经发现,核心数据“日期”属性实际上是时间戳。它们包括一天中的时间,尽管它们被称为“日期”。您不能告诉Core数据只使用日期属性值的一部分--它要么全部要么什么都不使用。
要获得所需的分组类型,需要创建另一个属性,其中的值仅为所需的值,而不是包含不需要的额外细节的时间戳。在这里,这将是一个时间、分钟和秒都设置为零的日期,这样这些细节不会影响分组。
一种方法是使用该更改创建一个新的日期对象,并将其保存在一个新属性中。你可以叫它trimmedDate。然后,无论何时在实例上设置日期,也可以使用代码设置trimmedDate,如下所示
NSDate *trimmed = [[NSCalendar currentCalendar] dateBySettingHour:0 minute:0 second:0 ofDate:date options:0];然后使用这个新值进行分组。
https://stackoverflow.com/questions/69924077
复制相似问题