2017-10-12 142 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; 
    } 
) 

我的猜測是,獨特的功能是什麼,發生在查詢語句和對於在內存商店中進行提貨並不存在。