对于我而言,我无法完成这一项工作,但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的低度理解。
任何帮助非常感谢!
我会尝试存储objectID而不是URI表示。不知道这是否能解决您的问题,但对我来说似乎更强大一点。 –
保存会话时,如果托管对象上下文不为零,请检入调试器。 –
你在哪里断言你的managedObjectContext与主线程相关联?你在哪里断言你的方法将在主线程上执行? – CouchDeveloper