Cannot delete object that was never inserted.
这是我的应用周期的主旨:
1 /推VIEwController.
2 /从app delegate获取托管对象上下文.
FLAppDelegate *appDelegate = (FLAppDelegate *)[[UIApplication sharedApplication] delegate]; self.managedobjectContext = appDelegate.managedobjectContext;
3 /检查会话是否存在.
4 /没有会话,创建一个新会话.
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 /再次,检查会话是否存在.
8 /找到一个会话! (通过查看我们存储的NSUserDefaults以供稍后参考).所以我先前创建了Session I,然后让用户选择删除那个并重新开始或继续使用那个.
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 /选择删除此会话并开始新会话.
10 /问题从这里开始!我删除了我对此会话保持的引用,因为它不再相关,并尝试删除该对象,然后保存这些更改.
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyStoredSessionObjectIDUriRep]; [[NSUserDefaults standardUserDefaults] synchronize]; [self.managedobjectContext deleteObject:self.session]; NSError *error = nil; if (![self.managedobjectContext save:&error]) { //Error! }
11 /我们有了它,当我尝试运行save方法时,它会崩溃并抛出一个错误:NSUnderlyingException =“无法删除从未插入的对象.”;
我不知道它为什么这么说,因为我似乎在创建一个并创建引用时保存对象,从该引用中检索对象但是删除只是打破了所有内容.
解决方法 问题在于您的步骤4.在此步骤中您>创建会话
>将其托管对象ID保存为用户默认值
>保存对托管对象上下文的更改.
失败的原因是,当您创建新的托管对象时,它具有临时对象ID,该ID仅在您保存更改之前有效.只要保存更改,它就会获得一个新的永久对象ID.您正在保存临时对象ID,但是当您稍后查找它时,它将再次无效.
您可以通过更改步骤4中的 *** 作顺序来解决此问题,以便您:
>创建会话
>保存对托管对象上下文的更改
>将会话的对象ID保存为用户默认值
这样,将值保存为用户默认值时,您将拥有永久ID.
总结以上是内存溢出为你收集整理的ios – CoreData:“无法删除从未插入的对象.”全部内容,希望文章能够帮你解决ios – CoreData:“无法删除从未插入的对象.”所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)