我正在开发一个使用x.x.xcdatamodel的应用程序。现在,在同一个x.x.xcdatamodel中,我在其中一个实体中添加了一个属性。应用程序崩溃,显示消息“This NSPersistentStoreCoordinator has no persistent stores(schema mismatch or migration failure)”。无法执行保存操作。我尝试了很多方法,我也使用轻量级迁移来处理这种情况,但这并不奏效。下面是我的代码:
- (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;
}
}
我是不是错过了什么?或者,即使我在实体中添加一个属性,我也必须执行完全迁移?先谢谢你了。
5条答案
按热度按时间2w3kk1z51#
你不必自己在这里做迁移。您必须添加一个新版本的数据模型。您不能编辑
xcdatamodel
并期望Core Data仅使用新版本。您需要保留现有模型,创建新版本,并在新版本中**进行更改。您必须始终具有与持久存储文件匹配的模型版本。您可以通过在Xcode的文件浏览器中选择
xcdatamodel
模型文件,转到“编辑器”菜单,然后选择“添加模型版本...”来创建新版本。bpsygsoo2#
我在一个项目上工作,遇到了类似的问题,似乎前开发人员忘记了通过这两个选项进行轻量级迁移。我通过了第二个,迁移成功完成。
您可以使用传入
addPersistentStoreWithType:configuration:URL:options:error:
的选项字典请求自动轻量级迁移,方法是将NSMigratePersistentStoresAutomaticallyOption
和NSInferMappingModelAutomaticallyOption
键对应的值设置为YES
:hfsqlsce3#
在我的例子中,我在
xcdatamodeld
包中更改了xcdatamodel
的名称。我需要恢复名称更改以删 debugging 误。svujldwt4#
我只是
1.从模拟器中删除应用程序。
1.干净。
1.保存结果。
1.再次构建App。
这很适合我。当我对原始模型进行更改时,我总是这样做。
ve7v8dk25#
尝试将数据模型名称从“xxx.xcdatamodeld”更改为“xxx2.xcdatamodeld”。成功了