Базовое Удаление Данных управляет и many-many отношения

Документация уровня для обоих проектов ужасна.

Однако, так как SproutCore теперь поддерживается Apple, и Apple довольно хороша в обеспечении хорошей документации, я ожидаю, что это изменится.

Cap, однако имеет выпущенное приложение (280Slides) реального мира, с которым у Вас может быть игра понять то, как Вы должны структурировать свое приложение. Таким образом в этой точке его, вероятно, легче начать с Cap тем более, что Вы знаете цель-c.

знать, что для обоих проектов, количество средств управления out-of-the-box очень ограничено, таким образом, Вы реализуете свое собственное. Кроме того, SproutCore ужасен по умолчанию!

Лично, я думаю, что подход Cap превосходен.

Вы не должны писать HTML или CSS. Действительно такое чувство записи настольного приложения и путем кодирования в цели-js, Вы по существу абстрагированы от браузера.

Однако я не поклонник самого языка. Я предпочел бы его, если бы они придерживались pov JavaScript.

я понимаю, что разработчикам Mac понравится потенциальная мобильность кода, который Вы создаете с Cap однако, так как Apple обанкротилась в 2012, я действительно не вижу точку:)

11
задан Peter Hosey 4 June 2010 в 12:20
поделиться

2 ответа

Правило каскада автоматически удаляет объекты в месте назначения. Итак, если вы удалите отдел, сотрудники будут удалены независимо от количества отделов, в которых они находятся.

Похоже, поведение, которое вы хотите, немного более тонкое, чтобы удалить только «осиротевших» сотрудников - т.е. те, у которых нет отдела. Когда вы удаляете отдел, хороший способ найти его - это сделать что-то вроде этого:

NSManagedObject *doomedDepartment = // get the department to be deleted

NSSet *employees = [doomedDepartment valueForKey:@"employees"];
NSSet *orphanedEmployees = [employees filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"departments.@count == 1"]];
for (NSManagedObject *orphanedEmployee in orphanedEmployees) {
    [managedObjectContext deleteObject:orphanedEmployee];
}    

[managedObjectContext deleteObject:doomedDepartment];
21
ответ дан 3 December 2019 в 03:52
поделиться

Спасибо, Алекс. Я, наверное, так и сделаю. Тем временем я нашел другой способ сделать это:

1.) Зарегистрироваться для получения уведомлений об изменениях:

    [[NSNotificationCenter defaultCenter] addObserver:self 
            selector:@selector(managedObjectContextDidChange:) 
            name:NSManagedObjectContextObjectsDidChangeNotification 
            object:managedObjectContext];

2.) Когда происходят изменения и обновляется сотрудник. Я проверяю, имеет ли этот объект 0 отношений с отделами, и удаляю его:

- (void)managedObjectContextDidChange:(NSNotification *)notification {
    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];

for(NSManagedObject *obj in updatedObjects){        
    // walk through updated objects -> check for employees
    // check if they still contain departments and if not delete them
    if([obj.entity.name isEqualToString:@"Employee"]){
        NSLog(@"Employee changed!");
        if([[(Employee*)obj Departments] count]==0){
            NSLog(@"No more relations -> Delete Employee");
            [managedObjectContext deleteObject:obj];
        }
    }
}}

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

5
ответ дан 3 December 2019 в 03:52
поделиться