我对Core Data迁移有疑问.
假设我有一个在表A中有一些预定义值的应用程序.我想将它与另一个数据库同步,使用表B,这样当新记录添加到B时,该记录应该添加到我的表A中.
我知道使用Core Data迁移,当我向表中添加列时,我将能够在添加列之前访问先前存储在旧表中的值.
我想知道如何使用另一个表上添加的记录更新我的表.
更新:
来自以下评论:
我想到的问题是......我想发布我的应用程序的更新.我坚持如何更新现有的核心数据数据库,该数据库也存储用户输入的数据.我需要做的就是更新一些记录并保留当前的用户数据.我该怎么做呢?
当我甚至不关心旧数据时,我花了很多时间将核心数据按摩到新的迁移中.每次我更改数据模型时,有没有办法只删除所有现有数据并跳转到新数据模型,而不是处理映射模型的麻烦?
我正在手动进行核心数据迁移,并且继续遇到可可错误134140:NSMigrationMissingMappingModelError。我注意到,只要对模型进行任何更改,即使将属性标记为可选,都可能发生这种情况。到目前为止,发生这种情况时,我发现的唯一解决方案是删除映射模型并创建新的映射模型。有没有更好,更乏味的解决方案?
我有我的核心数据库的第1版.(简化示例)

我对模型进行了一些更改,制作了V2.这涉及创建具有type属性加上其他一些的新实体.该类型属性是链接到该板的实体.

我的应用程序的新版本已发布,数据迁移正常,因为它是轻量级的.出于我自己的原因,我此时没有建立关系.
一段时间后,我决定对结构做一些更大的改动,创建新的实体FixtureType和PlateTypeImage.然后我创建了一些关系.这给了我模特的V3.

由于这种修改的性质,我需要进行从V2到V3的重量级迁移,包括复制属性数据,填充新属性以及设置关系.因此,我设置了一个映射模型,创建了必要的迁移策略并点击了go按钮.
这适用于V2到V3但是当测试从V1到V3的迁移时,我得到一系列错误......,例如
reason =无法就地迁移存储:验证错误缺少必需目标关系上的属性值
我正在使用以下PSC选项:
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES
};
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
Run Code Online (Sandbox Code Playgroud)
那么,我的查询是核心数据如何迁移数据?它是顺序的,所以我从V1到V2轻量级迁移,然后重量级V2到V3,还是从V1迁移到V3?如果是这样,我是否需要为V1到V3创建迁移策略(让事情变得笨拙以便涵盖所有组合)?
此外,一旦我开始使用重量级,我现在失去了轻量级迁移设施吗?
建议和意见表示赞赏.
我必须在我的coreData项目中添加一个实体,但我无法理解如何在swift中进行轻量级迁移.我坚持第8点,我如何将代码从objective-c转换为swift?谢谢!
1 - 打开.xcdatamodeld文件
2单击编辑器
3 - 选择添加型号版本...
4 - 添加模型的新版本(添加了新的数据模型组)
5 - 选择主文件,打开文件检查器(右侧面板)
6-和版本化的核心数据模型选择当前数据模型7的新版本数据模型 - 这不是全部)你应该执行所谓的"轻度迁移".
8 - 转到AppDelegate并找到正在创建persistentStoreCoordinator的位置
9-找到这一行if(![_ persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
使用@ {NSMigratePersistentStoresAutomaticallyOption替换nil选项:@YES,NSInferMappingModelAutomaticallyOption:@YES}(实际在该方法的注释代码中提供)
11-你去,玩得开心!
我有一个已经有 2 个实体的 .xcdatamodeld,我在这个文件中添加了另一个实体(我不确定这是否是添加新实体的正确方法),无论如何我的问题是,我需要实现任何类型的迁移以照顾已在其设备上安装该应用程序的用户。
请注意,我没有修改现有实体的任何列或架构。
干杯。
大约一年半前,我构建了一个应用程序,我将再次使用它。这是我开始学习 Swift 的项目,很明显,从那时起,语言和我的 Swift 能力都发生了很大变化。
昨天,我第一次更新了我的单个 CoreData 模型以添加一个可选的字符串属性。我做了文件生成位并确保在检查器列中正确选择了新的数据模型。
在我的模拟器和测试设备上,我需要删除旧版本的应用程序才能安装新版本,否则我会崩溃。我认为这只是开发环境过程的一部分。如何确保升级用户在从 App Store 进行简单更新时不必删除和重新安装?我假设 Xcode/CoreData/Apple 已经通过一些用户不可见的内部脚本或进程来处理这个问题,“它只是有效。” 但我想在此处发布此内容,以了解是否需要做任何其他事情来确保用户从 v1 平滑过渡到 v1.1。
正如我所提到的,我所做的只是一个可选的字符串列。我假设所有现有的用户数据都将迁移到新模式,新字段为nil.
这里的任何想法都将受到欢迎和赞赏。谢谢!
My Core Data模型包含一个实体Shape,它有两个自引用关系,这意味着四个属性.一对是一对多关系(Shape.containedBy < - >> Shape.contains),另一对是多对多关系(Shape.nextShapes << - >> Shape.previousShapes).这一切都在应用程序中完美运行,因此我不认为自引用关系通常是一个问题.
但是,在将模型迁移到新版本时,Xcode无法编译自动生成的映射模型,并显示以下错误消息:
2009-10-30 17:10:09.387 mapc[18619:607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "FUNCTION($manager ,'destinationInstancesForSourceRelationshipNamed:sourceInstances:' , 'contains' , $source.contains) == 1"'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff80d735a4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff83f0a313 objc_exception_throw + 45
2 Foundation 0x00007fff819bc8d4 _qfqp2_performParsing + 8412
3 Foundation 0x00007fff819ba79d +[NSPredicate predicateWithFormat:arguments:] + 59
4 Foundation 0x00007fff81a482ef +[NSExpression expressionWithFormat:arguments:] + 68
5 Foundation 0x00007fff81a48843 …Run Code Online (Sandbox Code Playgroud) cocoa core-data core-data-migration self-reference mapping-model
该应用程序使用bundle目录中的静态sqlite(初始数据)作为Coredata的持久存储.sqlite有7个表,其中一个表通过添加额外的列/字段进行修改.如何让coreData了解持久存储(存储)已更改并且需要采用新更新?对于sqlite有什么样的版本概念,就像我们为coredata做的那样吗?
我最近更改了实体内部属性的类型.我在数据库的新模型版本之前创建.但有些东西不能正常工作.如果我运行该项目,应用程序将抛出一个错误:
无法初始化应用程序的已保存数据
并在控制台中写道:
2016-01-04 23:21:16.805 toRep_Management [36979:10809172] CoreData:错误:-addPersistentStoreWithType:XML配置:(null)URL:file:///Users/Tom/Library/Application%20Support/de.toEducate. toRep_Management/CocoaAppCD.storedata选项:{NSInferMappingModelAutomaticallyOption = 1; NSMigratePersistentStoresAutomaticallyOption = 1; } ...返回错误错误Domain = NSCocoaErrorDomain Code = 134140"持久存储迁移失败,缺少映射模型." UserInfo = {sourceModel =()isEditable 1,entities {Notice ="()name Notice,managedObjectClassName toRep_Management.Notice,renamingIdentifier Notice,isAbstract 0,superentity name(null),properties {\n displayEndDate = \"(),name displayEndDate ,isOptional 1,isTransient 0,entity Notice,renamingIdentifier displayEndDate,validation predicates(\n),warnings(\n),versionHashModifier(null)\n userInfo {\n},attributeType 900,attributeValueClassName NSDate,defaultValue(null)\" ; \n displayStartDate = \"(),名称displayStartDate,isOptional 1,isTransient 0,entity Notice,renamingIdentifier displayStartDate,validation predicates(\n),warnings(\n),versionHashModifier(null)\n userInfo {\n}, attributeType 900,attributeValueClassName NSDate,defaultValue(null)\"; \n isOnline = \"(),name isOnline,isOptional 1,isTransient 0,entity Notice,renamingIdentifier isOnline,validation predicates(\n),warnings(\n), versionHashModifier(null)\n userInfo {\n},attributeType 800,att ributeValueClassName NSNumber,defaultValue(null)\"; \n …