此 NSPersistentStoreCoordinator 没有持久存储(模式不匹配或迁移失败)。它不能执行保存操作
This NSPersistentStoreCoordinator has no persistent stores (schema mismatch or migration failure). It cannot perform a save operation
我正在开发我们正在使用 x.x.xcdatamodel 的应用程序。现在在同一个 x.x.xcdatamodel 中,我在其中一个实体中添加了一个属性。应用程序崩溃并显示消息 "This NSPersistentStoreCoordinator has no persistent stores (schema mismatch or migration failure). It cannot perform a save operation."。我尝试了很多东西,我也在使用轻量级迁移来处理这种情况,但这不起作用,因为 well.Below 是我的代码:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myApp.sqlite"];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES,
NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}
};
if(![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
return __persistentStoreCoordinator;
}
- (BOOL) saveContext
{
@synchronized (_localStorage) {
//NSLog(@"----------------------------Save context called---------------------------");
BOOL result = TRUE;
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
//Crashes here at this line.
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
{
NSLog(@"----------------------------Save context failed---------------------------");
result = FALSE;
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
}
//NSLog(@"----------------------------Save context completed---------------------------");
return result;
}
}
我是不是漏掉了什么?或者即使我在实体中添加单个属性,我是否也必须执行完整的迁移?提前致谢。
您不必在这里自己进行迁移。您确实 必须添加新版本的数据模型。您不能编辑 xcdatamodel
并期望 Core Data 只使用新版本。您需要保留现有模型,创建新版本,然后在新版本中进行更改。您必须始终拥有与持久存储文件匹配的模型版本。
您通过在 Xcode 的文件浏览器中选择 xcdatamodel
模型文件创建一个新版本,转到 "Editor" 菜单,然后选择 "Add Model Version..."
我在做一个项目遇到了类似的问题,前开发者好像忘记传递这两个选项来进行轻量级迁移。我通过了第二个,迁移成功。
You request automatic lightweight migration using the options dictionary you pass in addPersistentStoreWithType:configuration:URL:options:error:
, by setting values corresponding to both the NSMigratePersistentStoresAutomaticallyOption
and the NSInferMappingModelAutomaticallyOption
keys to YES
:
NSError *error = nil;
NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
BOOL success = [psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeURL
options:options error:&error];
if (!success) {
// Handle the error.
}
在我的例子中,我更改了 xcdatamodeld
包中 xcdatamodel
的名称。我需要还原名称更改以消除错误。
我正在开发我们正在使用 x.x.xcdatamodel 的应用程序。现在在同一个 x.x.xcdatamodel 中,我在其中一个实体中添加了一个属性。应用程序崩溃并显示消息 "This NSPersistentStoreCoordinator has no persistent stores (schema mismatch or migration failure). It cannot perform a save operation."。我尝试了很多东西,我也在使用轻量级迁移来处理这种情况,但这不起作用,因为 well.Below 是我的代码:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myApp.sqlite"];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES,
NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}
};
if(![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
return __persistentStoreCoordinator;
}
- (BOOL) saveContext
{
@synchronized (_localStorage) {
//NSLog(@"----------------------------Save context called---------------------------");
BOOL result = TRUE;
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
//Crashes here at this line.
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
{
NSLog(@"----------------------------Save context failed---------------------------");
result = FALSE;
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
}
//NSLog(@"----------------------------Save context completed---------------------------");
return result;
}
}
我是不是漏掉了什么?或者即使我在实体中添加单个属性,我是否也必须执行完整的迁移?提前致谢。
您不必在这里自己进行迁移。您确实 必须添加新版本的数据模型。您不能编辑 xcdatamodel
并期望 Core Data 只使用新版本。您需要保留现有模型,创建新版本,然后在新版本中进行更改。您必须始终拥有与持久存储文件匹配的模型版本。
您通过在 Xcode 的文件浏览器中选择 xcdatamodel
模型文件创建一个新版本,转到 "Editor" 菜单,然后选择 "Add Model Version..."
我在做一个项目遇到了类似的问题,前开发者好像忘记传递这两个选项来进行轻量级迁移。我通过了第二个,迁移成功。
You request automatic lightweight migration using the options dictionary you pass in
addPersistentStoreWithType:configuration:URL:options:error:
, by setting values corresponding to both theNSMigratePersistentStoresAutomaticallyOption
and theNSInferMappingModelAutomaticallyOption
keys toYES
:
NSError *error = nil;
NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
BOOL success = [psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeURL
options:options error:&error];
if (!success) {
// Handle the error.
}
在我的例子中,我更改了 xcdatamodeld
包中 xcdatamodel
的名称。我需要还原名称更改以消除错误。