在我的NSPersistentdocument子类(Accountdocument)中,我覆盖了用于配置持久存储协调器的方法,以便为迁移获取正确的选项:
- (BOol)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(Nsstring *)fileType modelConfiguration:(Nsstring *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error{ NSMutableDictionary *newStoreOptions; if (storeOptions == nil) { newStoreOptions = [NSMutableDictionary dictionary]; } else { newStoreOptions = [storeOptions mutablecopy]; } [newStoreOptions setobject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresautomaticallyOption]; [newStoreOptions setobject:[NSNumber numberWithBool:YES] forKey:NSInferMapPingModelautomaticallyOption]; BOol result = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error]; return result;}
(感谢Malcolm Crawford的提示:http://homepage.mac.com/mmalc/CocoaExamples/controllers.html)
当我运行应用程序,它失败在NSPersistentdocument的实现-managedobjectModel:
* thread #1: tID = 0x2703,0x00007fff931d9350 libobjc.A.dylib`objc_msgSend_vtable13 + 16,stop reason = EXC_BAD_ACCESS (code=13,address=0x0) frame #0: 0x00007fff931d9350 libobjc.A.dylib`objc_msgSend_vtable13 + 16 frame #1: 0x00007fff8935e975 CoreData`-[NSKNownKeysDictionary1 _setValues:retain:] + 197 frame #2: 0x00007fff8935f288 CoreData`_newReadModelFromBytes + 648 frame #3: 0x00007fff8935b93e CoreData`+[NSManagedobjectModel(_NSManagedobjectModelPrivateMethods) _newModelFromOptimizedEnCoding:error:] + 9310 frame #4: 0x00007fff89359451 CoreData`-[NSManagedobjectModel(_NSManagedobjectModelPrivateMethods) initWithContentsOfOptimizedURL:] + 305 frame #5: 0x00007fff89358d7b CoreData`-[NSManagedobjectModel initWithContentsOfURL:] + 443 frame #6: 0x00007fff893e9519 CoreData`+[NSManagedobjectModel mergedModelFromBundles:] + 377 frame #7: 0x00007fff8ded7037 AppKit`-[NSPersistentdocument managedobjectModel] + 301 frame #8: 0x00007fff8ded70b3 AppKit`-[NSPersistentdocument managedobjectContext] + 75 frame #9: 0x00007fff8ded6e3f AppKit`-[NSPersistentdocument _persistentStoreCoordinator] + 18 frame #10: 0x00007fff8ded6b5d AppKit`-[NSPersistentdocument configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:] + 51 frame #11: 0x0000000100003193 BeanCounter`-[Accountdocument configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:] + 419 at Accountdocument.m:298
从我从文档中可以知道,默认实现看起来像这样:
- (ID)managedobjectModel{ NSManagedobjectModel *result = [NSManagedobjectModel mergedModelFromBundles:nil]; return result;}
所以要调试问题一点,我用这个overrode这个方法:
- (ID)managedobjectModel{ NSBundle *bundle = [NSBundle mainBundle]; NSURL *url = [bundle URLForResource:@"Accountdocument2" withExtension:@"momd"]; NSManagedobjectModel *result = [[[NSManagedobjectModel alloc] initWithContentsOfURL:url] autorelease]; return result;}
(感谢Jeff Lamarche的想法:http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html)
捆绑和url都指向我期望的地方(我遵循marcus Zarra的建议清理项目,所以在应用程序包中没有任何偏离的.mom或.momd包:Using mergedModelFromBundles: and versioning (CoreData))。然而,应用程序继续崩溃,而从网址加载模型。
我检查Accountdocument2.xcdatamodeld是一个包有两个版本控制模型:Accountdocument 2.xcdatamodel和(原始)Accountdocument.xcdatamodel。文件属性中的“Versioned Core Data Model”d出菜单设置为“Accountdocument 2”。
两个模型之间的唯一区别是一个实体有一个附加的(和可选的)属性。我的理解是,限定了轻量级迁移的模型。
显然,我在这里做错了,但我不知道什么。任何帮助将最感谢…
更新:
根据Martin的建议(和检查NSPersistentdocument文档)我试图使用这个代码为访问器:
- (ID)managedobjectModel{ static ID sharedManagedobjectModel = nil; if (sharedManagedobjectModel == nil) { NSBundle *bundle = [NSBundle mainBundle]; NSURL *url = [bundle URLForResource:@"Accountdocument2" withExtension:@"momd"]; sharedManagedobjectModel = [[NSManagedobjectModel alloc] initWithContentsOfURL:url]; } return sharedManagedobjectModel;}
仍在崩溃…
更新
在Twitter上的一些建议后,我升级到Xcode 4.3.2,但问题仍然存在。
快速更新
我刚刚使用雪豹上的Xcode 4.2创建版本化模型包(Accountdocument2.xcdatamodeld)。构建和运行应用程序后,一切正常工作。
然后我把Accountdocument2.xcdatamodeld文件包转移到lion和Xcode 4.3.2。当我构建和运行应用程序时,它会继续崩溃,而加载.momd资源。是孩子,这意味着Xcode 4.3.x和数据模型编译器(MOMC)是怪。我没有看到一个@R_301_6120@,除了做所有我的构建在雪豹。
我不是一个打击Xcode 4,但是当我们发现自己在一个情况下,工具链不能从不透明的规范(.xcdatamodel和.xcdatamodeld)产生一个不透明的文件(.mom和.momd),很难对Mac和iOS工具的状态乐观。可笑的是,这些平台的核心组件突破了我无法在最新版本的SDK和开发工具上构建和运行我的应用程序的程度。
这是更新
更多的证明,这是一个严重的错误与数据模型编译器(MOMC)在Xcode 4.3.2:如果我将.momd捆绑包从Xcode 4.2创建的资源文件夹复制到我的项目,并将它们添加到构建作为复制文件构建阶段,应用程序工作正常。
我也做了一些测试,我删除了各个实体的属性的验证规则和默认值(基于marcus的建议)。没有改变,编译器仍然创建一个无效的.momd。我也试着创建一个版本化模型,其中nothing已更改:编译的.momd继续崩溃。因此,无论你在当前模型(和他们代表的数据)有什么是问题的根源。
还要注意:这个BUG不是孤立到NSPersistentdocument(就像我最初想到的,当我开始这个问题。)我可以通过使用[[NSManagedobjectModel alloc] initWithContentsOfURL:modelURL]导致应用程序崩溃。
现在,我将使用SNow Leopard上的Xcode 4.2编辑/版本化我的模型,并将已编译的资源移动到lion上的Xcode 4.3.2。如果你以任何方式使用核心数据,我建议你做同样,直到这个错误得到解决。相信我,你会花费几天试图找出什么是地狱正在发生,如果你不。
现在提交雷达…
雷达更新
我刚刚提交了这个雷达:
http://www.openradar.me/11184500
哦噢,它必须是狮子更新
我刚刚从http://developer.apple.com/downloads下载并安装了Xcode 4.2 for lion工具。Radar中使用的示例应用程序仍然崩溃。
(注意:你不能安装Xcode 4.2.1,因为用于签署DeveloperTools.pkg的证书已经过期,只有Xcode 4.2可以工作。)
如果你在NDA下,你还会发现,测试版工具也没有帮助。
希望你有一个雪豹的Xcode 4.2坐在周围:http://furbo.org/2012/03/28/vmware-for-developers/
WTF获取请求必须使用带版本的实体和属性更新
通过Evadne Wu在Twitter上:
https://twitter.com/#!/evadne/status/187625192342818818
她是怎么做到的:
https://twitter.com/#!/evadne/status/187629091518816258
(.mom文件是二进制列表。)
问题的根源是单个提取请求。如何将数据从一个模型迁移到另一个模型是由苹果的工程师弄清楚。
@R_301_6120@ 在“existingPartner”提取请求更改后,可以加载已编译的.momd资源:name == $name
至:
name == $name
这是违反直觉的,对象模型的一部分,不影响数据的持久性中断版本控制和轻量级迁移。从文档中很清楚,这不应该是这样:
Core Data’s perspective on versioning is that it is only interested in features of the model that affect persistence.
使用CHOCKLOCK的权力修复您的获取请求或完全删除它们,依靠NSPredicates created in code。
总结以上是内存溢出为你收集整理的objective-c – NSPersistentDocument的轻量级迁移全部内容,希望文章能够帮你解决objective-c – NSPersistentDocument的轻量级迁移所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)