Как выполнить повторную визуализацию ячеек в отношении "один ко многим" в CoreData

Я учусь coreData и я новичок в этом, я создал отношения босс и работник один-ко-многим (то есть один начальник и много сотрудников). Так что я показываю всех боссов на firstTableView и когда пользователь нажимает на ячейки, он может просматривать сотрудников, назначенных каждому боссу, а также он может добавлять сотрудников к любому конкретному боссу. Теперь я хочу изменить порядок боссов. Так как это должно быть сделано?

Отредактировано на основе обсуждения ниже

   - (void)insertNewObject:(NSString *)fileName
{    
    Boss *bossName = [NSEntityDescription insertNewObjectForEntityForName:@"Boss" inManagedObjectContext:self.managedObjectContext];

    [bossName setName:fileName];

    NSManagedObject *lastObject = [self.controller.fetchedObjects lastObject];
    float lastObjectDisplayOrder = [[lastObject valueForKey:@"displayOrder"] floatValue];
    NSLog(@"%f",lastObjectDisplayOrder);
    [bossName setValue:[NSNumber numberWithDouble:lastObjectDisplayOrder + 1.0] forKey:@"displayOrder"];

    // Save the context.
    NSError *error = nil;
    if (![self.managedObjectContext save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

1 ответ

Решение

[Конкретный ответ на обновленный вопрос]

Это было бы либо....

[self.boss insertObject:newEmployeeObject inEmployeesAtIndex:0];

Это метод, сгенерированный из базовых данных, который является частью вашего подкласса Boss, если вы решите создать подклассы из вашей модели. Или же....

NSMutableOrderedSet *employees = [self.boss mutableOrderedSetValueForKey:@"employees"];
[employees insertObject:newEmployee atIndex:0]

Это не настолько интуитивно понятно, я знаю, вы не можете просто сделать изменяемую копию, вы должны получить специальный прокси-объект от mutableOrderedSetValueForKey,


[Оригинальный общий ответ]...

Базовые данные теперь могут использовать "Упорядоченные отношения", которые вы можете указать в своей модели. Если вы сделаете это, отношения в вашей объектной модели будут представлены новым классом NSOrderedSet который является гибридом NSArray и NSSet, Переупорядочив объекты в этом объекте отношений и сохранив контекст, вы измените порядок объектов в базе данных, и они сохранят свой новый порядок. Этот тип упорядоченных отношений имеет тенденцию использоваться, когда на объекте нет естественного атрибута упорядочения. Например, порядок просто представляет предпочтение пользователей для упорядочивания списка в пользовательском интерфейсе.

Если, с другой стороны, у вас есть атрибут на одном из ваших объектов, который описывает порядок для коллекции, вы можете использовать этот атрибут, чтобы упорядочить результаты NSFetchRequest, указав Sort Descriptors, Значение атрибута будет указывать позицию, в которой будет находиться объект в результатах NSFetchRequest,

Если вы используете Ordered Relationships вам нужно будет сохранить порядок NSOrderedSet для этих отношений и тому UITableView в синхронизации. Если изменение было перенесено из пользовательского интерфейса, вы отвечаете на UITableViewDataSource делегировать методы, такие как - (void)moveRowAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex и использовать предоставленную информацию, чтобы переместить соответствующий объект в его новую позицию в отношении "ядро-данные", либо используя прокси-объект из mutableOrderedSetValueForKey: или сгенерированные в Core-data средства доступа сгенерированного подкласса.

Если бы изменение порядка было обусловлено данными, вы бы использовали методы UITableView такие как insertRowsAtIndexPaths:withRowAnimation: а также moveRowAtIndexPath:toIndexPath: синхронизировать строки в UITableView с изменениями, которые вы вносили в данные.

Если вы используете NSFetchRequest У вас есть похожая задача. В этом случае вы реагируете на пользовательские изменения в порядке, обновляя атрибуты сортировки ваших объектов в соответствии с новым порядком, который описывается UITableView сквозь UITableViewDataSource делегировать. Или, если изменение порядка начинается со стороны данных, вы обновляете UITableView через его методы, чтобы соответствовать изменениям, которые вы вносите в атрибуты сортировки данных. В этом случае вы будете работать с результатами NSFetchResults как NSArray Вы также должны будете синхронизировать этот объект до следующего запуска NSFetchRequest, Вы можете использовать тот же дескриптор сортировки для сортировки массива, либо создать NSMutableArray и использовать его методы для перемещения данных в соответствии с таблицей.

Наконец, если вы используете NSFetchRequest вы можете посмотреть на NSFetchedResultsController Его задача - упростить задачу синхронизации отсортированного NSFetchRequest и UITableView, Для этого есть хороший пример кода в документации. В этом случае вы можете обнаружить, что порядок данных позаботится о себе. Например, скажем, ваша таблица упорядочена по "дате назначения" (т. Е. По дате, когда сотрудник был назначен начальнику), тогда простое создание объектов с правильной информацией приведет к получению правильных результатов в таблице.

Обратите внимание, что упорядоченные отношения не работают с iCloud. Однако, по моему мнению, iCloud все равно не работает, так что это не проблема.

Другие вопросы по тегам