ios - 核心数据不同计数

标签 ios core-data count distinct

我想要相当于 SQL 函数的核心数据:

SELECT species, sex, COUNT(*) FROM Bird GROUP BY species, sex;

通常会返回此内容的请求

+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| Bus     | m    |        2 |
| Car     | f    |        1 |
+---------+------+----------+

包含以下条目:

INSERT INTO  Bird VALUES ('BlueBird','Car','f');
INSERT INTO  Bird VALUES ('RedBird','Bus','m');
INSERT INTO  Bird VALUES ('RedBird','Bus','m');

我已经成功满足了不同的请求,但我在计数(*)时遇到了麻烦。 这是我所拥有的:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Bird" inManagedObjectContext:managedObjectContext];
[request setEntity:entity]; 
[request setReturnsDistinctResults:YES];
[request setResultType:NSDictionaryResultType];
NSDictionary *entityProperties = [entity propertiesByName];

NSMutableArray *properties = [NSMutableArray arrayWithObject:[entityProperties objectForKey:@"species"]];
[properties addObject:[entityProperties objectForKey:@"sex"]];
[request setPropertiesToFetch: properties];

我应该添加什么?

最佳答案

示例数据隐含的数据模型表明您必须获取每个对象、过滤并重新获取:

NSManagedObjectContext *moc;
NSEntityDescription *birdEntity = [NSEntityDescription entityForName:"Bird" inManagedObjectContext:moc];

NSFetchRequest *fetchAllBirds = [[NSFetchRequest new] autorelease];
[fetchAllBirds setEntity:birdEntity];
NSArray *allBirds = [moc executeFetchRequest:fetchAllBirds error:NULL];

NSArray *species = [allBirds valueForKeyPath:@"@distinctUnionOfObjects.species"];

NSMutableDictionary *speciesCounts = [NSMutableDictionary dictionaryWithCapacity: [species count]];
for (NSString *speci in species)
{
    NSFetchRequest *fetchSpeci = [[NSFetchRequest new] autorelease];
    [fetchSpeci setEntity: birdEntity];
    [fetchSpeci setPredicate:[NSPredicate predicateWithFormat:@"speci == %@", speci]];

    int speciCount = [moc countForFetchRequest:fetchSpeci];
    [speciesCounts setObject:[NSNumber numberWithInt:speciCount] forKey:speci];
}

我建议重构数据。您可以将 species 属性替换为与 Species 实体的关系。

CoreData 不是一个关系数据库,它是一个对象图持久化框架。如果您尝试将其用作关系数据库,您最终会陷入困惑。

关于ios - 核心数据不同计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4888487/

相关文章:

mysql - SQL 计数和平均值

mysql - 按日期计数和分组应在没有值时返回 0

iOS - 错误的围栏设置 - 我们正在设置一个潜在的可延迟交易,而我们已经在跟踪动画围栏

ios - 使用iOS核心数据解析xml数据并存储它

android - 将 GetFile 与 Phonegap 一起使用时的独占参数

Swift 核心数据类方法?

iphone - 启用 iTunes 文件共享时隐藏 Core Data sqlite 文件

javascript - 如何获取javascript "array"的长度

ios - 滚动到特定 ViewController 时 Xcode 6 Storyboard崩溃

ios - Alamofire - request.cancel() 也正在取消来自该服务器的所有其他请求?