NSFetchRequest“returnsDistinctResults”似乎被忽略
问题描述:
我正在尝试获取所有对象上属性的唯一值列表(类似于[array valueForKeyPath:@"@distinctUnionOfObjects.key"]
。从我所知道的情况来看,我应该能够通过创建与resultType
的NSFetchRequest
设置为NSDictionaryResultType
,指定propertiesToFetch
和设置returnsDistinctResults
到YES
。这样做似乎没有工作。NSFetchRequest“returnsDistinctResults”似乎被忽略
我已经创建了一个实体,称为Person
与三个属性firstName
,lastName
和age
。下面是代码我试图用以下方式测试:
NSManagedObjectModel *objectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel];
[coordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:nil];
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
context.persistentStoreCoordinator = coordinator;
[context performBlockAndWait:^{
NSArray *lastNames = @[@"Smith",@"Johnson"];
NSArray *firstNames = @[@"John", @"Susan"];
for (NSString *lastName in lastNames) {
for (NSString *firstName in firstNames) {
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
person.firstName = firstName;
person.lastName = lastName;
person.age = @(18);
}
}
}];
[context save:nil];
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
fetchRequest.resultType = NSDictionaryResultType;
fetchRequest.propertiesToFetch = @[@"age"];
fetchRequest.returnsDistinctResults = YES;
NSArray *results = [context executeFetchRequest:fetchRequest error:nil];
NSLog(@"%@",results.description);
当我运行此,这是日志我得到:
2017-10-12 16:17:54.723 TestCoreData[10650:879197] (
{
age = 18;
},
{
age = 18;
},
{
age = 18;
},
{
age = 18;
}
)
更改propertiesToFetch
到@[@"lastName"]
给出了相似的结果:
2017-10-12 16:32:45.143 TestCoreData[10800:929908] (
{
lastName = Smith;
},
{
lastName = Johnson;
},
{
lastName = Johnson;
},
{
lastName = Smith;
}
)
我的预期是,这些只会返回一个单个输入为age
,两个为lastName
。
我误解了使用 的returnsDistinctResults
或使用不正确?
答
所以事实证明,这是因为我正在使用内存存储。如果我不是背这个和SQLite商店,它将按预期工作,让这些结果:
2017-10-12 17:21:48.546 TestCoreData[11767:1035544] (
{
age = 18;
}
)
和
2017-10-12 17:23:52.632 TestCoreData[11803:1044179] (
{
lastName = Johnson;
},
{
lastName = Smith;
}
)
我的猜测是,独特的功能是什么,发生在查询语句和对于在内存商店中进行提货并不存在。
我只是想知道它是否是使用内存存储的结果。您是否尝试过使用SQL存储类型? – pbasdf
@pbasdf是的,我发布这个并试了一下后,我在想同样的事情,这似乎是问题所在。感谢您的意见。 –