iPhone - 在删除 CoreData 中的对象后尝试保存新对象时应用程序崩溃

Posted

技术标签:

【中文标题】iPhone - 在删除 CoreData 中的对象后尝试保存新对象时应用程序崩溃【英文标题】:iPhone - App crashes when trying to save new objects after deleting objects in CoreData 【发布时间】:2011-08-24 21:23:41 【问题描述】:

好的,我在删除存储在 CoreData 中的所有对象后保存时遇到问题。如果我不删除任何内容,我在保存时没有问题,但是只要我要求它删除所有对象(所有内容都会删除而没有错误或问题),然后再次尝试保存,它就会崩溃并给我一个 程序收到信号:SIGABRT。这是我的代码。

- (void)deleteStoredData

    // Define our table/entity to use  
    NSEntityDescription *entity = [NSEntityDescription entityForName:MOVIE_LIST inManagedObjectContext:managedObjectContext];

    // Setup the fetch request  
    NSFetchRequest *request = [[NSFetchRequest alloc] init];  
    [request setEntity:entity];

    // Fetch the records and handle an error  
    NSError *error;
    NSUInteger count = [managedObjectContext countForFetchRequest:request error:&error];

    if (count) 
        for (int i = 0; i < count - 1; i++) 
            NSManagedObject *eventToDelete = [self.listOfMovies objectAtIndex:i];
            [managedObjectContext deleteObject:eventToDelete];
        
    

    [request release];

我认为可能是我将 self.listOfMovies 与存储的对象进行比较,所以我重新获取,将其复制到临时 NSMutableArray,然后将 self.listOfMovies 替换为 temp。但没有变化,仍然崩溃。我是否有一些方法删除了整个记录并且它不再存在?

我要做的是将所有内容加载到应用程序中,然后删除 CoreData 中的所有对象,以便在应用程序关闭(或终止)时将所有新数据保存在记录中。我这样做是否正确,还是有更简单的方法来做到这一点?哦,是的,我只有一个拥有 5 个 NSString 的实体,所以没什么复杂的。

在此先感谢大家。

【问题讨论】:

很难说你想做什么。对您的数据模型、发生错误的行以及您遇到的实际错误进行高级描述会非常有帮助。 我的模型中只有一个实体。称为电影。该实体有 5 个属性是 NSString 的。如果我所做的只是保存,一切都会完美保存。它可以毫无问题地获取。仅当我尝试删除对象然后稍后保存时才会出现此问题。它在保存并在主应用程序上提供 SIGABRT 时崩溃。 此代码将从持久存储中删除所有 MOVIE_LIST 对象及其所有数据。那是你想做的吗? 是的。 Christophers 的回答有效,但我也发现我的模拟器很糟糕,需要重新安装。 【参考方案1】:

可能,当您调用 save 方法时,可能会与某些变量混淆,例如 managedObjectContext

您是否尝试在删除后立即保存(即在您上面的 deleteStoredData 方法中)?

顺便说一句,我也会使用 Christopher 的代码;-)。

【讨论】:

我将代码更改为 Christopher 建议的内容,但没有帮助。是的,我尝试在删除后保存。那就是它发生的时候。如果我不删除任何内容,我可以保存一整天。但是,一旦我尝试删除一个对象,程序就会崩溃,并出现 SIGABRT 错误。 也许你的持久存储坏了?尝试重置模拟器。 好的,看起来就是这样。模拟器是一个会做饭的人。我在手机上加载了应用程序,它运行良好。现在我只需要弄清楚为什么它会加载错误。谢谢。【参考方案2】:

使用这样的 for 循环删除托管对象很容易出错,并且可能会损坏 managedObjectContext。请尝试以下操作:

NSFetchRequest * fetch = [[[NSFetchRequest alloc] init] autorelease];

[fetch setEntity:[NSEntityDescription entityForName:MOVIE_LIST inManagedObjectContext:context]];

NSArray * result = [context executeFetchRequest:fetch error:nil];

for (NSManagedObject * event in result) 
    [context deleteObject:event];

【讨论】:

试过这个,但同样的问题。这让我发疯了……哈哈。 这有助于减少错误,但我发现我的问题是需要重置并重新安装模拟器。谢谢。【参考方案3】:

由于您的数组中已经包含了所有 managedObject,您不需要再进行一次提取,只需使用下面的代码删除它们就可以了。

for (NSUInteger i = 0; i < [self.listOfMovies count] - 1; i++) 
    NSManagedObject *eventToDelete = [self.listOfMovies objectAtIndex:i];
    [managedObjectContext deleteObject:eventToDelete];

如果仍然有问题,请告诉我您的 App 中有多少个 managedObjectContext?您是在后台线程中删除还是保存?

另外,请您在您的应用程序崩溃后,在控制台中输入“bt -> enter key”来发布崩溃日志和信息吗?

【讨论】:

以上是关于iPhone - 在删除 CoreData 中的对象后尝试保存新对象时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

TabBar iphone 应用程序中的 CoreData 和 Shared ManagedobjectContext

Core Data 无法删除从未插入的对象错误

如何解决 iphone 5 iPhone 图书管理员中的问题 [12461] <错误>:无法下载文件://localhost/private..使用 coredata 和 icloud 时

CoreData 适用于我的模拟器,但不适用于使用 xCode 6 的 iOS 8 Swift 中的 iPhone

删除 CoreData 实体中的所有记录

SwiftUI - 如何在 CoreData 中删除实体中的行