当你不需要文件迁移的时候,也就是说 你就建一个的时候 只会有 绿色对号上面的一个,PushNoticationModel这个名字也可以和"PushNoticationModel.sqlite" 前缀不一样 比如说 ass.sqlite,一样可以运行的,不和一些网上人流传的一样必须保持一致。 但是你如果要进行数据迁移,升级 这个时候 你就需要保持一致了,我就是因为这个错误 一直没有迁移成功。
迁移的步骤 可以根据网上的进行操作
1.选择上你的xcdatamodel文件 Design -> Data Model -> Add Model Version 然后默认操作就可以了 那么就可以生成图片上的绿色箭头了。
2.然后系统会自动帮你将它设置成 当前版本。测试 数据迁移成功与否,你可以来回切换 下面的版本。步骤是 选择上级最上面的 xcdatamodeld ,在inspector中的Versioned Core Data Model选择你要的版本。
3. 对属性 进行添加 等轻量级 操作:选中绿色箭头,然后操作coredata。如果以前有旧的coredata 生成的entity类 删掉,,然后在绿色箭头的基础上重新生成。目的就是保持最新的属性和实体就好了。
4. 然后选择最上面的PushNoticationModel 右键 new file 选择coredate 然后 选择mapping model 就可以了
剩下他默认操作。这些步骤 你都可以根据网上的其它文章进行操作
5. 然后修改代码,
-(NSPersistentStoreCoordinator *)persistentStoreCoordinator:(NSString*)modelName
{
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
//得到数据库的路径
NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//CoreData是建立在SQLite之上的,数据库名称需与Xcdatamodel文件同名 @"PushNoticationModel.sqlite"
NSURL *storeUrl = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:modelName]];
NSError *error = nil;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self getmanagedObjectModel:self.managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
NSLog(@"persistentStoreCoordinator Error: %@,%@",error,[error userInfo]);
}
return persistentStoreCoordinator;
} 主要是option 这个即使你不需要版本迁移 写上去也不会错
网上的人解释不清的,也就是我迷惑的地方是:
-(NSManagedObjectModel *)getmanagedObjectModel:(NSManagedObjectModel *)managedobjectModel
{
if (managedobjectModel != nil) {
return managedobjectModel;
}
// managedobjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"PushNoticationModel" withExtension:@"momd"];
managedobjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedobjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"PushNoticationModel"withExtension:@"momd"];
到底用PushNoticationModel 还是用PushNoticationModel2? 答案是PushNoticationModel 和下面的生成数字没关系,这就是为什么苹果默认生成 2的时候前面有个空格的原因 PushNoticationModel 2,而我开始以为需要带2,所以修改了名字去掉了空格。
剩下要注意的地方是"PushNoticationModel.sqlite" 也不要带2.
我直做了添加属性 至于其它操作 或许你还要修改代码