应用程序启动前的核心数据第二次迁移-出现未解决的错误:域错误



我对Core Data相当陌生,只在App Store上发布了我的应用程序的1.0和1.1.1版本。

在开始开发1.2.0时,我成功地完成了核心数据的轻量级迁移,创建了一个新的模型。一切正常。我最近发现我的一个实体有问题,因此我不得不将属性从NSDate更改为NSString。考虑到这一点,我再次进行了迁移,并将其命名为1.2.x。这被选为当前版本,但当我运行我的应用程序时,我得到:

Unresolved error Error Domain=NSCocoaErrorDomain Code=134140 "The operation couldn’t be completed (Cocoa error 134140.)" UserInfo=0x1702e1380 {sourceModel=(<NSManagedObjectModel: 0x170086450>) isEditable 1, entities 
{Date = "(<NSEntityDescription: 0x17014d9f0>) name Date, managedObjectClassName Date, renamingIdentifier Date, isAbstract 0, superentity name (null), properties {n    dateOfEvent = "(<NSAttributeDescription: 0x170104c80>), name dateOfEvent, isOptional 1, isTransient 0, entity Date, renamingIdentifier dateOfEvent, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 900 , attributeValueClassName NSDate, defaultValue (null)";n    transactions = "(<NSRelationshipDescription: 0x17014daa0>), name transactions, isOptional 1, isTransient 0, entity Date, renamingIdentifier transactions, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Transaction, inverseRelationship dates, minCount 0, maxCount 0, isOrdered 0, deleteRule 1";n}, subentities {n}, userInfo {n}, versionHashModifier (null)";
Years = "(<NSEntityDescription: 0x17014e020>) name Years, managedObjectClassName Years, renamingIdentifier Years, isAbstract 0, superentity name (null), properties {n    transactions = "(<NSRelationshipDescription: 0x17014e0d0>), name transactions, isOptional 1, isTransient 0, entity Years, renamingIdentifier transactions, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Transaction, inverseRelationship years, minCount 0, maxCount 0, isOrdered 0, deleteRule 1";n    yearOfEvent = "(<NSAttributeDescription: 0x170300510>), name yearOfEvent, isOptional 1, isTransient 0, entity Years, renamingIdentifier yearOfEvent, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 900 , attributeValueClassName NSDate, defaultValue (null)";n}, subentities {n}, userInfo {n}, versionHashModifier (null)";
    }, fetch request templates {
    }, destinationModel=(<NSManagedObjectModel: 0x17008a550>) isEditable 0, entities
Transaction = "(<NSEntityDescription: 0x17014c8c0>) name Transaction, managedObjectClassName Transaction, renamingIdentifier Transaction, isAbstract 0, superentity name (null), properties {n    dates = "(<NSRelationshipDescription: 0x17014c080>), name dates, isOptional 1, isTransient 0, entity Transaction, renamingIdentifier dates, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Date, inverseRelationship transactions, minCount 0, maxCount 1, isOrdered 0, deleteRule 1";n    item = "(<NSRelationshipDescription: 0x17014c130>), name item, isOptional 1, isTransient 0, entity Transaction, renamingIdentifier item, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Item, inverseRelationship type, minCount 0, maxCount 1, isOrdered 0, deleteRule 1";n    notes = "(<NSAttributeDescription: 0x17011dbe0>), name notes, isOptional 1, isTransient 0, entity Transaction, renamingIdentifier notes, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 700 , attributeValueClassName NSString, defaultValue (null)";n    occasion = "(<NSRelationshipDescription: 0x17014c1e0>), name occasion, isOptional 1, isTransient 0, entity Transaction, renamingIdentifier occasion, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Occasion, inverseRelationship categories, minCount 0, maxCount 1, isOrdered 0, deleteRule 1";n    subevent = "(<NSRelationshipDescription: 0x17014c290>), name subevent, isOptional 1, isTransient 0, entity Transaction, renamingIdentifier subevent, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Subevent, inverseRelationship categories, minCount 0, maxCount 1, isOrdered 0, deleteRule 1";n    wasReceived = "(<NSAttributeDescription: 0x17011dc70>), name wasReceived, isOptional 1, isTransient 0, entity Transaction, renamingIdentifier wasReceived, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, attributeType 800 , attributeValueClassName NSNumber, defaultValue (null)";n    whoBy = "(<NSRelationshipDescription: 0x17014c340>), name whoBy, isOptional 1, isTransient 0, entity Transaction, renamingIdentifier whoBy, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Person, inverseRelationship transactions, minCount 0, maxCount 1, isOrdered 0, deleteRule 1";n    years = "(<NSRelationshipDescription: 0x17014c3f0>), name years, isOptional 1, isTransient 0, entity Transaction, renamingIdentifier years, validation predicates (\n), warnings (\n), versionHashModifier (null)\n userInfo {\n}, destination entity Years, inverseRelationship transactions, minCount 0, maxCount 1, isOrdered 0, deleteRule 1";n}, subentities (null), userInfo {n}, versionHashModifier (null)";

应用程序运行时未出现此错误。我已经完成并将所有的NSDate更改为NSString,但我似乎很担心这个错误的发生,因为它仍然不起作用。

我显然不能让我的用户卸载和重新安装该应用程序(适用于Xcode);我能做些什么让它在不需要用户重新安装的情况下运行吗?为什么核心数据轻量级迁移不起作用?

更新我有两个问题:

1) 因为我只更改属性的数据类型,所以我需要执行轻量级迁移到另一个版本,还是只更改以前创建的模型的新版本的属性数据类型?

2) 我的应用程序中有下面的代码,并且在中止代码处调用了一个断点异常,并出现上面的错误:

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    //abort();

如果我像上面一样对此进行评论,该应用程序可以工作,但问题顶部输出的错误仍然存在。此外,更重要的是,数据不会迁移。这有多安全?这让我在发送带有这些问题的应用程序时感到紧张。

您必须将NSDate值转换为NSString。仅仅改变类型是不够的。如果你已经在做了,那么从你的问题中还不清楚。您得到的特定错误是NSMigrationMissingMappingModelError,在CoreDataErrors.h中定义。Core Data不知道如何从NSDate到NSString。您必须提供一种从一个映射到另一个的方法。

最新更新