iPhone核心数据轻量级迁移:无法合并模型 [英] iPhone Core Data Lightweight Migration: Can't merge models
问题描述
我刚刚开始使用iPhone核心数据,我在轻量级迁移中遇到了一个问题。
- 重新生成模型类文件
- 将新模型版本设为当前版本
- 在AppDelegate中生成的模板中添加了以下代码
NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption ,nil];
if(![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:& error] li>
-
最后,我在运行应用之前做了一个干净的构建。
当应用程式崩溃时,我收到以下错误...
无法完成操作。 (Cocoa错误134140.)UserInfo = 0x622b350 {reason =无法找到或自动推断迁移的映射模型
现在调试我添加了以下代码...
NSError * error = nil;
NSDictionary * sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:& error];
if(!sourceMetadata){
NSLog(@sourceMetadata is nil);
} else {
NSLog(@sourceMetadata is%@,sourceMetadata);
}
这会显示以下结果...
2011-01-20 18:18:41.018 MyApp [4438:207 ] sourceMetadata is {
NSPersistenceFrameworkVersion = 248;
NSStoreModelVersionHashes = {
Fugitive =< e33370b6 e7ca3101 f91d2595 1e8bfe01 3e7fb4de 6ef2a31d 9e50237b b313d390> ;;
};
NSStoreModelVersionHashesVersion = 3 ;
NSStoreModelVersionIdentifiers =(
);
NSStoreType = SQLite;
NSStoreUUID =E711F65F-3C5A-4889-872B-6541E4B2863A;
_NSAutoVacuumLevel= 2;
}
我检查了应用程序包> MyApp.momd> VersionInfo.plist文件
它有以下内容...
<?xml version =1.0encoding =UTF-8?>
<!DOCTYPE plist PUBLIC - // Apple // DTD PLIST 1.0 // ENhttp://www.apple.com/DTDs/PropertyList-1.0.dtd\">
< plist version =1.0>
< dict>
< key> NSManagedObjectModel_CurrentVersionName< / key>
< string> MyApp 2< / string>
< key> NSManagedObjectModel_VersionHashes< / key>
< dict>
< key> MyApp< / key>
< dict>
< key> Fugitive< / key>
< data>
4zNwtufKMQH5HSWVHov + AT5 / tN5u8qMdnlAje7MT05A =
< / data>
< / dict>
< key> MyApp 2< / key>
< dict>
< key> Fugitive< / key>
< data>
N58Lf4BNpACzrsHAb1 + BQImgjsBZ + u5G0wGUyt84 + Ec =
< / data>
< / dict>
< / dict>
< / dict>
< / plist>
我在这里缺少什么?
UPDATE :问题是我在模型中错过的默认值属性。
p>您可以尝试强制Core Data推断映射模型:
NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool: YES],NSInferMappingModelAutomaticallyOption,nil];
如果对模型的更改是微不足道的,那么Core Data可能能够推断映射模型。如果失败,那么您可能需要创建一个映射模型(并恢复到当前使用的选项)。
映射模型很容易创建。请注意,如果您更改数据模型,则还需要更新映射。
您可能想要查看这是SO post 。
I just started with iPhone core data and I ran into a problem in lightweight migration.
- I added two new fields to my old model
- Regenerated the model class files
- Made the new model version as current version
Added the following code in AppDelegate in the template generated
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
Then at last, I did a clean build before running the app.
I get the following error when the app crashes...
The operation couldn’t be completed. (Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration
Now to debug I added the following code...
NSError *error = nil;
NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error];
if (!sourceMetadata) {
NSLog(@"sourceMetadata is nil");
} else {
NSLog(@"sourceMetadata is %@", sourceMetadata);
}
This displays the following result...
2011-01-20 18:18:41.018 MyApp[4438:207] sourceMetadata is {
NSPersistenceFrameworkVersion = 248;
NSStoreModelVersionHashes = {
Fugitive = <e33370b6 e7ca3101 f91d2595 1e8bfe01 3e7fb4de 6ef2a31d 9e50237b b313d390>;
};
NSStoreModelVersionHashesVersion = 3;
NSStoreModelVersionIdentifiers = (
);
NSStoreType = SQLite;
NSStoreUUID = "E711F65F-3C5A-4889-872B-6541E4B2863A";
"_NSAutoVacuumLevel" = 2;
}
I checked the app bundle > MyApp.momd > VersionInfo.plist file
its got the following contents...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSManagedObjectModel_CurrentVersionName</key>
<string>MyApp 2</string>
<key>NSManagedObjectModel_VersionHashes</key>
<dict>
<key>MyApp</key>
<dict>
<key>Fugitive</key>
<data>
4zNwtufKMQH5HSWVHov+AT5/tN5u8qMdnlAje7MT05A=
</data>
</dict>
<key>MyApp 2</key>
<dict>
<key>Fugitive</key>
<data>
N58Lf4BNpACzrsHAb1+BQImgjsBZ+u5G0wGUyt84+Ec=
</data>
</dict>
</dict>
</dict>
</plist>
What am I missing here?
UPDATE: The problem turned out to be a default value attribute that I had missed in the model.
You might try forcing Core Data to infer a mapping model:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
If the changes to your model were trivial, then Core Data may be able to infer a mapping model. If that fails, then you will probably need to create a mapping model (and revert to the options that you are currently using).
Mapping models are easy to create. Be mindful, though, if you change a data model then you will need to update the mapping, too.
You might want to check out this SO post.
这篇关于iPhone核心数据轻量级迁移:无法合并模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!