对于我的生活,我无法解决这个问题,但CoreData不断给我一个错误。
无法删除从未插入的对象。
这是我的应用周期的主旨:
1 /推送ViewController。
2 /从app delegate获取托管对象上下文。
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
并开始新的。{/ p>
10 / 问题从这里开始!我删除了我保留给Session
的引用,因为它不再相关,并尝试删除该对象,然后保存这些更改。
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kKeyStoredSessionObjectIdUriRep];
[[NSUserDefaults standardUserDefaults] synchronize];
[self.managedObjectContext deleteObject:self.session];
NSError *error = nil;
if (![self.managedObjectContext save:&error])
{
//Error!
}
11 /我们有了它,当我尝试运行save方法时,它会崩溃并抛出错误:NSUnderlyingException = "Cannot delete object that was never inserted.";
我不知道为什么会这样说,因为我似乎每当我创建一个并保存对象并创建引用时,从该引用中检索对象但是删除只会破坏所有内容。
答案 0 :(得分:5)
问题在于您的步骤4.在此步骤中
Session
此失败的原因是,当您创建新的托管对象时,它具有临时对象ID,该ID仅在您保存更改之前有效。只要保存更改,它就会获得一个新的永久对象ID。您正在保存临时对象ID,但是当您稍后查找它时它将再次无效。
您可以通过更改步骤4中的操作顺序来解决此问题,以便:
Session
Session
的对象ID保存为用户默认值这样,当您将值保存为用户默认值时,您将拥有永久ID。