2013-11-24 30 views
3

对于我而言,我无法完成这一项工作,但CoreData一直在向我抛出一个错误。CoreData:“无法删除从未插入的对象。”

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

这里是我的应用程序周期的JIST:

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/Pop ViewController。

6返回ViewController。

7再次检查是否存在Session

8/A 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.";

我不知道为什么这样说,因为我的出现拯救对象,每当我创建一个并创建引用时,从该引用检索对象,但删除只是打破了一切。希望有一个简单的解决方案,它只是我对CoreData的低度理解。

任何帮助非常感谢!

+0

我会尝试存储objectID而不是URI表示。不知道这是否能解决您的问题,但对我来说似乎更强大一点。 –

+0

保存会话时,如果托管对象上下文不为零,请检入调试器。 –

+0

你在哪里断言你的managedObjectContext与主线程相关联?你在哪里断言你的方法将在主线程上执行? – CouchDeveloper

回答

4

的问题是在您的步骤4在此步骤中,您

  1. 创建Session
  2. 保存它的管理对象ID用户默认
  3. 更改保存到你的管理对象范围内。

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

  1. 创建Session
  2. 将更改保存到管理对象上下文
  3. 保存Session的对象:

    您可以只用在第4步让你改变操作的顺序解决这个问题ID到用户默认值

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

+0

就是这样!谢谢汤姆。 –

+0

这工作谢谢你,但参考文件没有说临时objectID的不是NSEntityDescription和NSManagedObject。此外,为什么给一个临时的objectId返回任何非零的东西,一旦没有对象了呢? –

+0

在NSManagedObjectID等文档中提到了临时ID。 “objectWithID”方法被记录为**总是**返回一个对象。 –