Iphone 保存上下文中的CoreData错误,NSPersistentStoreCoordinator没有持久存储
我已经研究了我能找到的每一个类似的问题,他们的解决方案都不适合我 一个问题可能是,在我从webAPI获取JSON并解析后,向上下文添加实体(成功)和保存上下文发生在不同的线程上。但是,第一次使用manageContext和持久存储时就设置了上下文,如下所示。因此,它将在解析后的线程上发生 确切的错误是:Iphone 保存上下文中的CoreData错误,NSPersistentStoreCoordinator没有持久存储,iphone,ios,objective-c,core-data,Iphone,Ios,Objective C,Core Data,我已经研究了我能找到的每一个类似的问题,他们的解决方案都不适合我 一个问题可能是,在我从webAPI获取JSON并解析后,向上下文添加实体(成功)和保存上下文发生在不同的线程上。但是,第一次使用manageContext和持久存储时就设置了上下文,如下所示。因此,它将在解析后的线程上发生 确切的错误是: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
我已经尝试从模拟器中删除应用程序,正如建议的那样,没有改变
这是我正在使用的CoreDataHelper类,我的应用程序中只有一个该类的实例,在向上下文中添加新项后调用帮助程序上的saveContext方法时会发生错误:
@implementation CoreDataHelper
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
#pragma mark - Application's Documents directory
// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask] lastObject];
}
- (void)saveContext
{
NSError *error = nil;
if (self.managedObjectContext != nil) {
if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
- (void)dealloc {
[self saveContext];
}
#pragma mark - Core Data stack
// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"UserGroupTV.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
// needed for lightweight migrations
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:[NSNumber numberWithBool:YES]
forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES]
forKey:NSInferMappingModelAutomaticallyOption];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:options
error:&error]) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:[error localizedDescription]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alertView show];
}
return _persistentStoreCoordinator;
}
@end
ETA:我看到有人提到过,但是如何/在何处删除存储sql文件的机器上的本地文件夹?我没有一个明确的答案,但这里有几点需要注意:
persistentstorecordinator
的位置放置一些日志记录。如果在创建过程中添加存储时发生错误,您可以在那里捕获它NSManagedObjectContext
不是线程安全的,您应该只在创建它的线程上使用特定的上下文。每个线程至少需要一个上下文。您可以观察“NSManagedObjectContextDidSaveNotification”,并将更改合并到主上下文中事实证明,我是在删除存储,而不是每次调用web API时都重新创建它。我最初的目标是每当用户想通过调用api刷新视频列表时,清除数据库,我删除所有对象,然后删除存储并忘记重新创建它。这是我的刷新数据库方案,我只是删除了saveContext调用下面的所有内容
- (void)resetDataBase {
[self deleteAllObjects:@"Speaker"];
[self deleteAllObjects:@"Tag"];
[self deleteAllObjects:@"UserGroup"];
[self deleteAllObjects:@"Video"];
[_coreDataHelper saveContext];
// REMOVED BELOW and it worked
NSPersistentStore * store = [[_coreDataHelper.persistentStoreCoordinator persistentStores] lastObject];
if (store) {
NSError * error;
[_coreDataHelper.persistentStoreCoordinator removePersistentStore:store error:&error];
if (error) {
[self showError:error];
}
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"UserGroupTV.sqlite"];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
}
其中有一段代码,当我创建persistentStoreCoord时,如果出现错误(存储的返回值为nil),它将弹出一个警报视图。这是不可能的。检查零回报率并不能解决这个问题。创建没有存储的
NSPersistentStoreCoordinator
是有效的。您需要检查是否添加了特定的存储。很可能不是。此外,我唯一一次遇到这个错误是在后台运行我的应用程序时。可能不是你的问题,但请看。在问题中提及这一点会很有用。:)哈哈,我忘了问你是否在共享代码之外明确删除了存储@Mark W我也面临着类似的问题。是否会因为在后台线程中保存manageContext而发生这种情况?真的被困在这个。。。