Выборка определенных значений свойств

Эта статья содержит отрывки для выборки определенных значений атрибута для данного объекта.

Иногда Вы не хотите выбирать фактические управляемые объекты; вместо этого, Вы просто хотите получить — например — самое большое или самое маленькое значение определенного атрибута или отличные значения для данного атрибута. На iOS можно использовать NSExpressionDescription объекты указать функцию для запроса выборки, и setReturnsDistinctResults: возвратить уникальные значения.

Для выполнения выборки Вам минимально нужен контекст управляемого объекта, против которого можно выполнить выборку и описание объекта для указания объекта, который Вы хотите. Как Вы добираетесь, контекст управляемого объекта зависит от Вашей архитектуры приложения — посмотрите Получение Контекста Управляемого объекта. Как только у Вас есть контекст, можно получить использование объекта NSEntityDescriptionудобный метод, entityForName:inManagedObjectContext:.

Выборка отличных значений

Для выборки уникальных значений определенного атрибута через все экземпляры данного объекта Вы конфигурируете запрос выборки с методом setReturnsDistinctResults: (и передача YES как параметр). Вы также указываете, что выборка должна возвратить словари, а не управляемые объекты и имя свойства, которое Вы хотите выбрать.

NSManagedObjectContext *context = <#Get the context#>;
 
NSEntityDescription *entity = [NSEntityDescription  entityForName:@"<#Entity name#>" inManagedObjectContext:context];
 
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
[request setPropertiesToFetch:@[@"<#Attribute name#>"]];
 
// Execute the fetch.
NSError *error;
id requestedValue = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil) {
    // Handle the error.
}

Выборка Значений атрибута, Удовлетворяющих Заданную функцию

Для выборки значений, удовлетворяющих определенную функцию (такую как максимальное или минимальное значение) Вы используете экземпляр NSExpressionDescription для указания свойства или свойств, Вы хотите получить.

NSManagedObjectContext *context = <#Get the context#>;
 
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>" inManagedObjectContext:context];
[request setEntity:entity];
 
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
 
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"<#Key-path for the property#>"];
 
// Create an expression to represent the function you want to apply
NSExpression *expression = [NSExpression expressionForFunction:@"<#Function name#>"
    arguments:@[keyPathExpression]];
 
// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
 
// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"<#Dictionary key#>"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:<#Result type#>]; // For example, NSDateAttributeType
 
// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:@[expressionDescription]];
 
// Execute the fetch.
NSError *error;
id requestedValue = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil) {
    // Handle the error.
}
else {
    if ([objects count] > 0) {
        requestedValue = [[objects objectAtIndex:0] valueForKey:@"<#Dictionary key#>"];
    }
}

Для полного списка поддерживаемых функций посмотрите expressionForFunction:arguments:.

Если Вы хотите получить многократные значения одновременно, создайте многократные экземпляры NSExpressionDescription для представления различных значений, Вы хотите получить, и добавить их всех к массиву, в котором Вы передаете setPropertiesToFetch:. Они должны все, конечно, примениться к тому же объекту.