Как выполнить повторную визуализацию ячеек в отношении "один ко многим" в 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 все равно не работает, так что это не проблема.