Objective c 核心数据保存上下文后,未删除的对象值为空

Objective c 核心数据保存上下文后,未删除的对象值为空,objective-c,core-data,nspredicate,nsmanagedobjectcontext,nsfetchrequest,Objective C,Core Data,Nspredicate,Nsmanagedobjectcontext,Nsfetchrequest,我有一个具有objectId和objectName属性的对象。在我使用Core Data的deleteObject函数删除一个项并保存上下文后,该对象的值为null,即使我只将该对象用作谓词。这是我的密码 NSLog(@"%@", self.theObject.name); // it returns the object's name NSError *error = nil; NSFetchRequest *fetchRequest = [[NSFetchRequest a

我有一个具有objectId和objectName属性的对象。在我使用Core Data的deleteObject函数删除一个项并保存上下文后,该对象的值为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
}
这是核心数据的默认行为,还是我遗漏了什么?当我只将对象的值用作谓词时,为什么该对象的值为空

根据评论进行编辑

对象是从PrepareForegue方法中的父视图控制器设置的


我在viewDidLoad中记录了对象值,并成功设置了它。

简短的回答是:是的,它就是这样工作的

为了解释,我需要首先假设对象是核心数据中的托管对象。因此,它继承自NSManagedObjecctID,这使您能够通过objectId查询它

您可以将对象视为托管对象上下文中指向托管对象的指针。id使该对象在给定上下文中100%唯一

因此,当您请求该对象时,核心数据将返回该对象,因为您使用其id请求该对象

见:


核心数据不会返回您请求的对象的某些副本,在这种情况下,它将是一个不同的指针,但相同的数据会返回您请求的特定实例。

看起来您删除了上下文中具有对象ID的对象。。。哪个应该是目标@Volker我只是使用对象的ID作为谓词,并用请求填充MyObject数组。我只删除了myObject,它是MyClass,但保存上下文后该对象的值为null。太令人困惑了。另外,myObject和theObject是不同的类。所以如果Object显示为null,一定是有原因的,它不会神奇地发生。也许您可以提供更多关于如何创建对象的详细信息。通过在谓词中使用它,它的值不会重置为null。最好将此信息作为编辑添加到问题中。还要添加如何派生对象。它也是从您的上下文加载的吗?如果是,为什么在执行上面显示的删除操作时不删除它?@Volker的最后一条评论是正确的,如果条件成立的话。那么,你的目标是什么?
destinationViewController.theObject = self.theObjectsArray[indexPath.row];