- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用自定义 NSEntityMigrationPolicy
进行数据库升级。这就是我的数据模型现在的样子以及预期的结果:
A <-------->> B ( 1 A -> many B )
我想要一个新的 C 实体,它将“破坏”某些子集中的 B 类型对象:
A <-------->> C <------->> B ( 1 A can have many C, each C can have many B )
我为实体 A 制作了一个自定义 NSEntityMigrationPolicy
。我在 createDestinationInstancesForSourceInstance:entityMapping:manager:error:
中为每个 A 创建了一些 C 实体,但我不知道什么与A和B之间的关系有关。
在文档中,他们说要使用createRelationshipsForDestinationInstance
以某种方式创建新关系。然而,对于这种情况,我还没有找到任何有启发性的例子。我想可能可以在这里创建 A <->> C 关系,但 B 可能尚不存在于目标上下文中以创建 C <-->> B 关系。这样的迁移如何完成?请帮忙:)
谢谢!
最佳答案
基本方法是
按照正确的顺序进行操作非常重要。
由于数据库中不存在 C,您必须做一些小技巧:NSMigrationManager
可以存储 userInfo
。该 userInfo 字典在整个迁移过程中都可用。因此,您可以将在 A-to-C 中创建的每个 C 对象存储在 userInfo 字典中。您需要在 A 上有一个唯一标识符属性,以将其存储为键并将适当的 C 对象设置为值。在第三次迁移(B 到 C)中,您可以访问适当的 C 对象并将其分配给 B。
<强>1。 A-to-C:根据每个现有的 A 对象创建新的 C 对象。
在 beginEntityMapping:manager:error:
中创建初始的 NSMutableDictionary
并将其分配给 NSMigrationManager
的 userInfo 属性。
在 createDestinationInstancesForSourceInstance:entityMapping:manager:error:
中执行以下操作:
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
NSMutableDictionary *cObjects = (NSMutableDictionary *)[manager userInfo];
NSObject *aUniqueIdentifierForEveryAObject = [sInstance valueForKey:@"aUniqueIdentifier"];
NSManagedObject *destinationC = nil;
if ([[cObjects allKeys] containObject:aUniqueIdentifierForEveryAObject])
{
newC = [userInfo objectForKey:aUniqueIdentifierForEveryAObject];
}
else
{
newC = [NSEntityDescription insertNewObjectForEntityForName:@"C" inManagedObjectContext:[manager destinationContext]];
// Assign instance A (sInstance) to the newC and update the userInfo
[newC setValue:sInstance forKey:@"a"];
[cObjects setObject:newC forKey:aUniqueIdentifierForEveryAObject];
}
[manager associateSourceInstance:sInstance withDestinationInstance:destinationC forEntityMapping:mapping];
return YES;
}
- (BOOL)createRelationshipsForDestinationInstance:(NSManagedObject*)dInstance entityMapping:(NSEntityMapping*)mapping manager:(NSMigrationManager*)manager error:(NSError**)error
{
return YES;
}
<强>2。 A-to-A:迁移所有A对象
在这里你可以对A的属性进行一些额外的调整。重要的是,无论您是否有属性更改,您都必须创建此迁移,因为自动迁移已关闭。如果您没有任何更改,则只需在映射模型编辑器中创建实体映射即可。
<强>3。 B-to-B:迁移所有B对象并分配新的C对象
分配新的 C 对象。您不能在 createRelationships...
中执行此操作,因为您需要 A 对象及其唯一标识符才能从 userInfo 字典中获取适当的 C。
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
id destinationB = [NSEntityDescription insertNewObjectForEntityForName:@"B" inManagedObjectContext:[manager destinationContext]];
NSMutableDictionary *userInfo = (NSMutableDictionary *)[manager userInfo];
NSMutableDictionary *cObjects = (NSMutableDictionary *)[userInfo valueForKey:kCObjects];
A *anA = [sInstance valueForKey:@"a"];
NSObject *aUniqueIdentifierForA = [anA valueForKey:@"aUniqueIdentifier"];
C *newC = [userInfo objectForKey:aUniqueIdentifierForA];
[destinationB setValue:newC forKey:@"c"];
// Migrate all other attributes here
[destinationB setValue:... forKey:...];
[manager associateSourceInstance:sInstance destinationB forEntityMapping:mapping];
return YES;
}
- (BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
return YES;
}
我还没有测试过这个,但基本方法应该可行。
<小时/>更新
第 1 步:A 到 C 中出现错误。
// WRONG
[cObjects setObject:newC forKey:sInstance];
// UPDATED
[newC setValue:sInstance forKey:@"a"];
[cObjects setObject:newC forKey:aUniqueIdentifierForEveryAObject];
关于iphone - 自定义 NSEntityMigrationPolicy 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11190385/
我正在尝试从一个 .xcdatamodel 文件迁移到另一个。我有一个 NSEntityMigrationPolicy 子类,其名称已在 xcode-> .xcmappingmodel 文件 -> 实
我正在尝试使用自定义 NSEntityMigrationPolicy 进行数据库升级。这就是我的数据模型现在的样子以及预期的结果: A > B ( 1 A -> many B ) 我想要一个新
我的 iPhone 应用程序的核心数据模型正在发生变化,我有一个自定义映射模型和一个 NSEntityMigrationPolicy 用于我的一个对象。但是,我担心我的一些用户的核心数据库中会有数千个
我有两个模型版本 - 12 和 13。然后我创建了一个包含源 12 和目标 13 的 xcmappingmodel-File。 我将 NSEntityMigrationPolicy 子类化并将我的类添
我是一名优秀的程序员,十分优秀!