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