看起来这应该是直截了当的,但我还没有找到一个很好的例子.我有一个简单的核心数据实体,我想分成两个独立的实体.Apple的文档在很高的层次上提到了它(映射概述),然而,目前还不清楚实际的映射模型应该将关系与新的拆分实体关联回原始模型.
我正在尝试进行迁移
我有2个版本的模型
1.xcdatamodel
2.xcdatamodel
Run Code Online (Sandbox Code Playgroud)
我创建了从版本1到2的映射模型
1to2.xcmappingmodel
Run Code Online (Sandbox Code Playgroud)
问题是它无法找到我创建的迁移模型,因此mappingModel始终为nil.有什么我必须做的,以指定它应该使用什么mappingModel?
target = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];
//target and source are initialized correctly
mappingModel = [NSMappingModel mappingModelFromBundles:nil forSourceModel:source destinationModel:target];
Run Code Online (Sandbox Code Playgroud) iphone core-data objective-c core-data-migration mapping-model
我发现文档非常有限,我的问题解决方案无处可寻.
我需要添加新实体(与现有实体的关系).还添加并重命名现有实体的一些属性.
轻量化的例子:
旧模型有一个Item具有一个属性的实体name.
在新模型中,我想要Item一个新属性dateAdded并重命名name为title.此时,如果dateAdded是可选的或给定默认值,我可以使用轻量级迁移功能.如果我错了,请纠正我.
但我也想添加List带有title属性的新实体.并增加了许多关系.列表可以为空或有很多项目.项目必须完全引用一个列表.
所以我很困惑我要做的一切以及订单是什么.
通过禁用轻量级迁移功能启用迁移(NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption, nil];).
创建新版本的模型.在那里,我做了我想做的改变.
创建一个新的映射模型.来源是旧模型,目标是新模型.在ItemToItem我设置title到$source.name.
除了Xcode在使用映射模型时仍然崩溃我不知道接下来该做什么.我想我必须List在上下文中创建一个实例,并且因为关系策略而使所有项引用它.我应该使用自定义NSEntityMigrationPolicy来做到这一点.有任何帮助来完成这一挑战吗?
问题
在非连续版本之间迁移并尝试使用那里提到的渐进式迁移时,我已经阅读了一些SO post Core Data Migration错误,但它在干净安装时失败,因为在progressivelyMigrateURL:
NSDictionary *sourceMetadata =
[NSPersistentStoreCoordinator metadataForPersistentStoreOfType:type
URL:sourceStoreURL
error:error];
if (!sourceMetadata) return NO;
Run Code Online (Sandbox Code Playgroud)
并在 - (NSPersistentStoreCoordinator*)persistentStoreCoordinator;
if (![self progressivelyMigrateURL:url
ofType:NSXMLStoreType
toModel:mom
error:&error]) {
[[NSApplication sharedApplication] presentError:error];
return nil;
}
//END:progressivelyMigrateCall
//START:persistentStoreCoordinator
if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType
configuration:nil
URL:url
options:nil
error:&error]) {...}
Run Code Online (Sandbox Code Playgroud)
这使得addPersistentStoreWithType:无法到达
我是否需要更改任何内容以使其工作?
不确定我是否需要完成所有这些工作,因为我已经阅读了一些评论,声明核心数据会自动完成所有这些工作,但还找不到任何文档.
我有一个使用Core Data的现有项目,我的xcdatamodeldbundle中有3个版本.到目前为止,我只使用了轻量级迁移,因为我主要添加了新的参数和实体,但是我现在希望将现有参数移动到新实体中.我意识到我必须mapping model克服一个这样做,以便在参数之间迁移数据.
我认为有些用户使用该版本的应用程序的旧版本,而其他版本使用版本2和3.
问题:
我是否需要更改/禁用我的轻量级迁移选项NSPersistentStoreCoordinator?目前我启用了以下选项:
NSMigratePersistentStoresAutomaticallyOption
NSInferMappingModelAutomaticallyOption
我认为仍然需要轻量级迁移从v1移动到v2到v3,但是新的映射模型需要从v3到v4.我已经浏览了一下,但由于大多数教程仅涵盖2个版本,因此无法找到有关这一切是如何发生的任何信息.
谢谢
在我的应用程序中添加新的Core Data模型版本后,我执行了轻量级迁移,显然已成功完成.迁移的文件加载正常,但在第一次尝试通过特定关系访问属性时,应用程序崩溃了NSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'.这种关系在迁移之前运行良好.我从其他帖子中了解到4294967295确实存在-1,但我唯一可以识别出我的应用程序/数据中有36个项目的是数据模型中共有36个实体(供参考,正在获取的关系有58个项目)它的表).
问题:
我的问题是:基于我得到的错误以及我在下面进行的故障排除,是否存在一种可以通过轻量级迁移的模式更改,但是在此过程中损坏了数据,导致了注意到的异常?我将尝试将迁移分解为几个版本的较小块,以隔离或避免问题,但能够专注于可能有问题的特定架构更改会很好.
失败:
使用"myobject"中的以下代码发生故障:
[[self object2] text];
Run Code Online (Sandbox Code Playgroud)
object2关系是一对一,非可选的两种方式,并且数据模型之间的正向和反向关系都没有改变.该text属性可能不相关,因为在发生错误时,awakeFromFetch在object2中未达到该属性.如果我[self object2]在上述语句之前分配变量,则分配成功并报告data: <fault>.
数据库:
在sqlite3中查看数据库,我注意到以下内容:
ZMYOBJECT如前所述,另外一列Z2_MYOBJECT,对于所有行都是空的).没有添加任何其他关系来解释此专栏.Z_PRIMARYKEY表中,迁移后的所有条目都显示-1为Z_MAX,而在迁移之前,它们对于空表和零填充表的最大行数显示为零.手动更新Z_MAX到正确的值对例外没有帮助.所有Z_SUPER数值都是正确的.我设置了一个映射模型,看看自动映射是否有任何错误,但一切看起来都很好.
整体架构更改:
在数据模型的源版本中,有14个实体,其中只有4个已经填充了数据(应用程序仍处于开发阶段).七个是顶级实体,七个是三个顶级实体的子实体.
在数据模型的目标版本中,添加了22个实体,一些顶级实体和一些子实体,具有几十个关系,包括一些添加到现有实体的关系.
某些属性和关系已从现有实体中删除,其他属性和关系已添加.未更改任何数据类型或关系设置,未重命名任何属性或关系,也不需要特殊映射.
更新(2/25/12):当我开始研究一个新的中间模型时,我记得我已经将NSManagedObject中的许多实体的类(representClassName)更改为NSManagedObject子类,但是没有生成类文件.我没有怀疑会导致问题,实际上,创建所有类文件对例外没有帮助.我只想注意到模型之间的另一个变化.
结论:
这是一个疯狂的猜测,但如果36实体计数不是巧合,似乎当"myobject"尝试在"object2"中出错时,它没有表的有效引用并且正在尝试加载表号-1 ,导致异常.[self object2]然而,简单分配成功的事实并不符合这一结论.
有任何想法吗?
现在,我使用版本控制对数据库进行任何更改。但这带来了一些问题。例如,很难将具有新db版本的功能分支合并到master / dev中,在那里有人也添加了新版本。
所以我的问题是:在不添加新版本的情况下在单个xcdatamodel中更改db是否安全?我已经尝试过了,但是它可以工作,但是在互联网上到处都可以看到警告,提示您一定不要这样做。
iOS9以上版本。
我发现了这个:https : //stackoverflow.com/a/37264096/5328417但它没有证据
我encrypted-core-data用来加密所有持久化的数据,以前很简单CoreData.persistentStoreCoordinator创建代码如下.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *oldStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"VistaJetApp.sqlite"];
NSURL *newStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"VistaJet.sqlite"];
NSError *error = nil;
NSString *currentPassword = [[VJAesCryptoWrapper getInstance] getCurrentPassword];
NSDictionary *options = [self getEncryptedStoreOptionsWithPassword:currentPassword andDatabaseStore:newStoreURL];
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
//if old store not exists , it means fresh installation
if([[NSFileManager defaultManager] fileExistsAtPath:oldStoreURL.path] == NO) {
if (![_persistentStoreCoordinator addPersistentStoreWithType:EncryptedStoreType configuration:nil URL:newStoreURL options:options error: &error]) {
}
} …Run Code Online (Sandbox Code Playgroud) app-store core-data-migration nspersistentstore keychainitemwrapper encrypted-core-data-sql
有人在 WatchKit + CoreData + CloudKit 上遇到过这个错误吗?
CoreData:调试:CoreData + CloudKit:-[PFCloudKitMetadataModelMigratorcalculateMigrationStepsWithConnection:错误:](404):跳过“ANSCKDATABASEMETADATA”的迁移,因为它已经有一个名为“ZLASTFETCHDATE”的列
请注意,该应用程序可以运行,并且我在模拟器或真实手表上运行该应用程序时没有遇到任何问题。其中有 9 个“错误”。
我认为这与下面持久容器的设置方式有关。
description.setOption(true as NSObject, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
...
container.viewContext.automaticallyMergesChangesFromParent = true // bring all iCloud changes into app
container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy // iCloud wins, local memory loses
Run Code Online (Sandbox Code Playgroud) 我读过一些文章,指出只要实体、属性或关系发生变化,就应该进行轻量级迁移。但前几天和学长聊天的时候,学长问我,新增属性时是否真的需要轻量级迁移。这让我很困惑。我知道在对核心数据模型进行任何更改之前我们应该始终创建一个新版本。那么这是否意味着版本控制与迁移相同。如果我们重命名现有属性,是否需要迁移?如果有人能帮助我,我将非常感激。