核心数据:"Cannot delete object that was never inserted."



对于我的生活,我无法解决这个问题,但CoreData不断给我抛出一个错误。

无法删除从未插入的对象。

这是我的应用程序周期的要点:

1/推送视图控制器。

2/从应用委托获取托管对象上下文。

FLAppDelegate *appDelegate = (FLAppDelegate *)[[UIApplication sharedApplication] delegate];
    self.managedObjectContext = appDelegate.managedObjectContext;

3/检查Session是否存在。

4/不存在Session,创建一个新的。

    self.session = nil;
            self.session = [NSEntityDescription insertNewObjectForEntityForName:@"Session" inManagedObjectContext:self.managedObjectContext];
    //Set attributes etc...
//Keep a reference to this session for later
    [[NSUserDefaults standardUserDefaults] setURL:self.session.objectID.URIRepresentation forKey:kKeyStoredSessionObjectIdUriRep];
            [[NSUserDefaults standardUserDefaults] synchronize];
            NSError *error = nil;
            if (![self.managedObjectContext save:&error])
            {
                //Handle error if save fails
            }

5/弹出视图控制器。

6/返回视图控制器。

7/再次检查Session是否存在。

8/找到了Session!(通过查看我们存储的那个NSUserDefaults以供以后参考(。所以我得到了我之前创建的Session然后让用户选择删除那个并重新开始或继续那个。

NSURL *url = [[NSUserDefaults standardUserDefaults] URLForKey:kKeyStoredSessionObjectIdUriRep];
    if (url) //Found existing flight session
    {
        NSManagedObjectID *objId = [self.managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:url];
        NSManagedObject *obj = [self.managedObjectContext objectWithID:objId];
        self.session = (Session *)obj;
        //Ask the user if they want to continue with this session or discard and start a new one
    }

9/选择删除此Session并开始一个新的。

10/问题从这里开始!我删除了我保留的对Session的引用,因为它不再相关,并尝试删除对象然后保存这些更改。

[[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyStoredSessionObjectIdUriRep];
            [[NSUserDefaults standardUserDefaults] synchronize];
            [self.managedObjectContext deleteObject:self.session];
            NSError *error = nil;
            if (![self.managedObjectContext save:&error])
            {
                //Error!
            }

11/我们有它,当我尝试运行保存方法时,它崩溃并抛出错误:NSUnderlyingException = "Cannot delete object that was never inserted.";

我不知道为什么这样说,因为每当我创建一个对象并创建引用时,我似乎都会保存对象,从该引用中检索对象,但随后删除只会破坏所有内容。

问题出在步骤 4 中。在此步骤中,您

  1. 创建Session
  2. 将其托管对象 ID 保存为用户默认值
  3. 保存对托管对象上下文所做的更改。

此操作失败的原因是,当您创建新的托管对象时,它具有一个临时对象 ID,该 ID 仅在您保存更改之前有效。保存更改后,它会立即获得一个新的永久对象 ID。您正在保存临时对象 ID,但稍后查找时,它不再有效。

只需更改步骤 4 中的操作顺序即可解决此问题,以便:

  1. 创建Session
  2. 保存对托管对象上下文所做的更改
  3. Session的对象 ID 保存到用户默认值

这样,当您将值保存到用户默认值时,您将拥有一个永久 ID。

相关内容

最新更新