Выборка управляемых объектов

Эта статья содержит отрывки для выборки управляемых объектов.

Для выборки управляемых объектов Вам минимально нужен контекст управляемого объекта, против которого можно выполнить выборку и описание объекта для указания объекта, который Вы хотите. Вы создаете экземпляр NSFetchRequest и укажите его объект. Можно дополнительно указать массив упорядочиваний вида и/или предиката.

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

Основная выборка

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

NSManagedObjectContext *context = <#Get the context#>;
 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>"
    inManagedObjectContext:context];
[fetchRequest setEntity:entity];
 
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // Handle the error.
}

Выборка с сортировкой

Для выборки управляемых объектов в определенном порядке в дополнение к компонентам в основной выборке (описанный в Основной Выборке), необходимо указать массив упорядочиваний вида:

NSManagedObjectContext *context = <#Get the context#>;
 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>"
    inManagedObjectContext:context];
[fetchRequest setEntity:entity];
 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>"
    ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
 
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // Handle the error.
}

Выборка с предикатом

Для выборки управляемых объектов, удовлетворяющих данные критерии в дополнение к компонентам в основной выборке (описанный в Основной Выборке), необходимо указать предикат:

NSManagedObjectContext *context = <#Get the context#>;
 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>"
    inManagedObjectContext:context];
[fetchRequest setEntity:entity];
 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"<#Predicate string#>",
    <#Predicate arguments#>];
[fetchRequest setPredicate:predicate];
 
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // Handle the error.
}

Для больше о предикатах, см. Руководство по программированию Предиката. Для альтернативного метода для создания предиката, который может быть более эффективным, посмотрите Выборку с Шаблоном Предиката.

Выборка с шаблоном предиката

Для выборки управляемых объектов, удовлетворяющих данные критерии в дополнение к компонентам в основной выборке (описанный в Основной Выборке), необходимо указать предикат.NSPredicate predicateWithFormat: метод обычно является самым простым способом использовать предикат (как показано в Выборке с Предикатом), но это не самый эффективный способ создать сам предикат. Строка формата предиката должна быть проанализирована, параметры, которыми заменяют, и т.д. Для критического по отношению к производительности кода, особенно если данный предикат неоднократно используется, необходимо рассмотреть другие способы создать предикат. Для предиката, который Вы могли бы часто использовать, самый простой первый шаг должен создать шаблон предиката. Вы могли бы создать метод доступа, создающий шаблон предиката лениво по требованию:

// Assume an instance variable:
// NSPredicate *predicateTemplate;
 
- (NSPredicate *)predicateTemplate {
    if (predicateTemplate == nil) {
        predicateTemplate = [NSPredicate predicateWithFormat:@"<#Key#> <#Operator#> <#$Variable#>"];
    }
    return predicateTemplate;
}

Когда необходимо использовать шаблон, Вы создаете словарь, содержащий переменные замены, и генерируете использование предиката predicateWithSubstitutionVariables:.

NSManagedObjectContext *context = <#Get the context#>;
 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>"
    inManagedObjectContext:context];
[fetchRequest setEntity:entity];
 
NSDictionary *variables = @{ @"<#Variable#>" : <#Value#> };
NSPredicate *predicate = [[self predicateTemplate]
    predicateWithSubstitutionVariables:variables];
[fetchRequest setPredicate:predicate];
 
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // Handle the error.
}

Для больше о предикатах, см. Руководство по программированию Предиката.

Выборка с сортировкой и предикатом

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

NSManagedObjectContext *context = <#Get the context#>;
 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"<#Predicate string#>",
    <#Predicate arguments#>];
[fetchRequest setPredicate:predicate];
 
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // Handle the error.
}

Для больше о предикатах, см. Руководство по программированию Предиката. Для альтернативного метода для создания предиката, который может быть более эффективным, посмотрите Выборку с Шаблоном Предиката.