0

У меня есть объект, который имеет атрибуты objectId и objectName. После того как я удалил элемент из функции deleteObject Core Data и сохранил контекст, значение объекта равно null, хотя я использовал объект только для предиката. Вот мой код.Значение Undeleted object равно null после контекста сохранения основных данных

NSLog(@"%@", self.theObject.name); // it returns the object's name 

NSError *error = nil;   
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"objectId==%@", self.theObject.objectId]; 
fetchRequest.predicate = predicate; 

NSArray *myObjects = [context executeFetchRequest:fetchRequest error:&error]; 

for (MyClass *myObject in myObjects) { 
    [context deleteObject:myObject]; 
} 

if (![context save:&error]) { 
    NSLog(@"Could not delete! %@ %@", error, [error localizedDescription]); 
} else { 
    NSLog(@"%@", self.theObject.name); // it returns null 
} 

Является ли это поведением Core Data по умолчанию или я что-то пропустил? Почему значение theObject имеет значение null, когда я использовал его только для предиката?

Редактировать основанный на комментарий

theObject устанавливается от контроллера представления родительского внутри prepareForSegue метода.

destinationViewController.theObject = self.theObjectsArray[indexPath.row]; 

Я вошел theObject значение в viewDidLoad и он был установлен успешно.

+0

похоже, что вы удаляете объект в своем контексте, у которого есть идентификатор объекта ..., который должен быть объектом ...?! – Volker

+0

@Volker Я просто использовал идентификатор объекта для предиката и заполнил массив myObjects запросом. Я удалил только myObject (это MyClass), но значение объекта Object равно null после сохранения контекста. Это так запутанно. Постскриптум myObject и theObject - это разные классы. –

+0

поэтому, если объект Object показывает null, должна быть какая-то причина, это не происходит волшебным образом. Возможно, вы дадите более подробную информацию о том, как вы создаете объект. Используя его в предикате, его значения не будут сбрасываться в NULL. – Volker

ответ

0

Короткий ответ: да, вот как это работает.

Для объяснения, я должен сначала предположить, что объект является управляемым объектом в основных данных. Таким образом, он наследует от NSManagedObjecctID, что дает вам возможность запрашивать его с помощью objectId.

Вы можете думать об объекте как указатель на управляемый объект в контексте управляемого объекта. Идентификатор - это то, что делает этот объект 100% уникальным в данном контексте.

Поэтому, когда вы делаете запрос для этого объекта, основные данные возвратят объект, потому что вы запросили объект, используя его идентификатор.

см: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html

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

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

  • Нет связанных вопросов^_^