2014-02-14 9 views
0

Сегодня у меня возник интересный вопрос от коллеги. Сначала ответ казался простым, но потом я понял, что никогда не видел никаких документов, подтверждающих мое предположение.Неуправляемые члены NSSet в NSManagedObject сохраняют удаленные элементы при сохранении?

Учитывая NSManagedObject, такие как Person, который имеет отношение один-ко-многим с другим объектом, например, Friends, а код ниже - будет friend1 и friend2 быть сохранены в хранилище данных?

NSManagedObjectContext *context = [a private context]; 
Person *aPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" 
               inManagedObjectContext:context]; 

NSMutableSet *friendsSet = [NSMutableSet new]; 
// Create some friends in the private context 
Person *aFriend1 = [NSEntityDescription insertNewObjectForEntityForName:@"Friend" 
               inManagedObjectContext:context]; 
[friendsSet addObject:friend1]; 
Person *aFriend2 = [NSEntityDescription insertNewObjectForEntityForName:@"Friend" 
               inManagedObjectContext:context]; 
[friendsSet addObject:friend2]; 

// Add these friends to aPerson 
[person addFriends:friendsSet]; 

// Alas! aPerson decides they want better friends. 
NSMutableSet *betterFriendsSet = [NSMutableSet new]; 

Person *aFriend3 = [NSEntityDescription insertNewObjectForEntityForName:@"Friend" 
               inManagedObjectContext:context]; 
[betterFriendsSet addObject:friend3]; 
Person *aFriend4 = [NSEntityDescription insertNewObjectForEntityForName:@"Friend" 
               inManagedObjectContext:context]; 
[betterFriendsSet addObject:friend4]; 

// Dump those old friends 
aPerson.friends = nil; 
// Add the new friends 
[person addFriends:betterFriendsSet]; 

// Save 
[context save:nil]; 

Есть ли у aperson 2 друзей или 4 в хранилище данных? Мое предположение было бы 2, так как больше нет сильных ссылок на friend1 и friend2, они должны быть выпущены. Тем не менее, основанные на данных сгенерированные аксессуры могут делать больше за кулисами и содержать в себе сильную ссылку на них, и в этом случае они будут сохраняться в хранилище данных.

ответ

0

Ну, для начала, методов входящих в комплекте поставки основных данных, для добавления и удаления установочных элементов для свойства Основных сведений (например, свойство «Оценка»): Добавить один член

- (void)addRatingsObject:(RatingsDB *)value; 
- (void)removeRatingsObject:(RatingsDB *)value; 

Добавить набор членов

- (void)addRatings:(NSSet *)value; 
- (void)removeRatings:(NSSet *)value; 

Далее, метод insertNewObjectForEntityForName будет создавать базовые данные объекты для «друзей», и они не будут сохраняться с сохранить независимо от того, что вы делаете с содержанием NSSet. Они просто перестанут отделяться от созданного с нуля ни одного.

После завершения, как описано, у вас будет четыре записи «Friend».

1

Вы на самом деле просят две разные вещи:

будет friend1 и friend2 настаиваться в хранилище данных?

Да. Вы добавили их в контекст управляемого объекта, а затем сохранили изменения. Сохраняются ли они, не зависит от того, связаны ли они с aPerson. Это не имеет ничего общего с создаваемыми аксессуарами, просто вы добавили их в контекст и никогда не удаляли. Если вы не хотите их хранить, вам необходимо удалить их.

Есть ли у aperson 2 друзей или 4 в хранилище данных?

У этого есть два. Поскольку вы установили friends в nil, вы удалили связь для первых двух экземпляров друга. Когда ваш код выше заканчивается, aPerson имеет двух друзей. Предыдущие друзья все еще находятся в постоянном магазине, но они больше не связаны ни с одним из Person.

Смежные вопросы