CoreData:"无法删除从未插入的对象."

Jos*_*ane 5 core-data objective-c ios

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

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

这是我的应用周期的主旨:

1 /推ViewController.

2 /从app delegate获取托管对象上下文.

FLAppDelegate *appDelegate = (FLAppDelegate *)[[UIApplication sharedApplication] delegate];
    self.managedObjectContext = appDelegate.managedObjectContext;
Run Code Online (Sandbox Code Playgroud)

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
            }
Run Code Online (Sandbox Code Playgroud)

5/Pop ViewController.

6 /返回ViewController.

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

Session找到8/A !(通过查看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
    }
Run Code Online (Sandbox Code Playgroud)

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!
            }
Run Code Online (Sandbox Code Playgroud)

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

我不知道它为什么这么说,因为我似乎在创建一个并创建引用时保存对象,从该引用中检索对象但是删除只是打破了所有内容.

Tom*_*ton 5

问题在于您的步骤4.在此步骤中您

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

失败的原因是,当您创建新的托管对象时,它具有临时对象ID,该ID仅在您保存更改之前有效.只要保存更改,它就会获得一个新的永久对象ID.您正在保存临时对象ID,但是当您稍后查找它时,它将再次无效.

您可以通过更改步骤4中的操作顺序来解决此问题,以便您:

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

这样,将值保存为用户默认值时,您将拥有永久ID.