2017-10-12 130 views
1

我正在尝试获取所有对象上属性的唯一值列表(类似于[array valueForKeyPath:@"@distinctUnionOfObjects.key"]。从我所知道的情况来看,我应该能够通过创建与resultTypeNSFetchRequest设置为NSDictionaryResultType,指定propertiesToFetch和设置returnsDistinctResultsYES。这样做似乎没有工作。NSFetchRequest“returnsDistinctResults”似乎被忽略

我已经创建了一个实体,称为Person与三个属性firstNamelastNameage。下面是代码我试图用以下方式测试:

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或使用不正确?

+0

我只是想知道它是否是使用内存存储的结果。您是否尝试过使用SQL存储类型? – pbasdf

+0

@pbasdf是的,我发布这个并试了一下后,我在想同样的事情,这似乎是问题所在。感谢您的意见。 –

回答

1

所以事实证明,这是因为我正在使用内存存储。如果我不是背这个和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; 
    } 
) 

我的猜测是,独特的功能是什么,发生在查询语句和对于在内存商店中进行提货并不存在。