objective-c – NSPersistentDocument的轻量级迁移

objective-c – NSPersistentDocument的轻量级迁移,第1张

概述我试图做一个轻量级迁移的SQLite存储在Core Data。在Lion 10.7.3上使用Xcode 4.3.1。 在我的NSPersistentDocument子类(AccountDocument)中,我覆盖了用于配置持久存储协调器的方法,以便为迁移获取正确的选项: - (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url o 我试图做一个轻量级迁移的sqlite存储在Core Data。在lion 10.7.3上使用Xcode 4.3.1。

在我的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的轻量级迁移所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1047508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存