Каков наилучший способ сортировки основного объекта данных?

У меня есть полностью работающая базовая модель данных, но когда я возвращаю данные с помощью запроса на выборку, он выглядит, по-видимому, случайным. Каков наилучший способ сортировки этих данных? Следует ли использовать другую таблицу в модели Core Data и "запросить" первую? Или это должно было бы вывести данные в массив и отсортировать его таким образом?

Я не слишком уверен, как это сделать, и поэтому я задаю этот вопрос.

Ответ 1

Ваш вопрос довольно общий, но я постараюсь дать вам несколько советов.

Когда вы используете класс NSFetchRequest, вы можете указать дескрипторы сортировки.

От Apple doc:

Массив дескрипторов сортировки (экземпляры NSSortDescriptor), которые указать, как должны быть упорядочены возвращенные объекты, например фамилию, затем по имени.

Здесь вы можете найти простой пример в Док-документах с базовыми данными

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 = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    // Handle the error
}

// release allocated objects if you don't use ARC

Где

< #Entity name # > - это имя объекта, который вы хотите получить, например. Manager.

< #Sort key # > - это имя ключа, который запрос будет использовать для заказа, например. name является атрибутом объекта Manager.

Итак, в моем примере:

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

Так как setSortDescriptors: задает массив дескрипторов сортировки, вы можете указать несколько ключей, которые вы хотите заказать. например укажите для порядка name и salary. Дескрипторы сортировки применяются в том порядке, в котором они отображаются в массиве sortDescriptors. Итак, в моем примере, сначала name, а затем salary.

Итак, в моем примере это может стать

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
    ascending:YES];
NSSortDescriptor *sortBySalary = [[NSSortDescriptor alloc] initWithKey:@"salary"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, sortBySalary, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

Надеюсь, что это поможет.

Edit

Так как fetchedObjects содержит NSManagedObject (я полагаю, вы не изменили тип результата вашего запроса), вам нужно повторить следующее:

for(NSManagedObject* currentObj in fetchedObjects) {

    NSLog(@"Print the name %@", [currentObj valueForKey:@"name"]);
}

Итак, вам нужно получить доступ к атрибутам или отношениям с помощью кода ключа. Чтобы сделать вашу жизнь проще, вы могли бы подумать о создании подклассов NSManagedObject для созданных вами сущностей, таких как organising-core-data-for-ios.