ios核心数据 - 将实体记录复制到另一个实体

Posted

技术标签:

【中文标题】ios核心数据 - 将实体记录复制到另一个实体【英文标题】:ios core data - copy entity records to another entity 【发布时间】:2012-07-16 05:43:36 【问题描述】:

我有 2 个实体,Units 和 BUnits,Units 实体有一个数据会被多次替换,BUnits 将是 Units 实体在清除数据之前的备份。

所以,我已经创建了一个 NSManagedObjectContext 实例,然后我通过使用为每个实体检索了一个实例

NSManagedObjectContext *context = [mainDelegate managedObjectContext];

NSEntityDescription *unitsEntity = [NSEntityDescription entityForName:@"Units" inManagedObjectContext:context];

NSEntityDescription *bUnitsEntity = [NSEntityDescription entityForName:@"BUnits" inManagedObjectContext:context];

但我没有设法将 Units 实体记录复制到 BUnits 实体,除了为每个记录创建一个循环,但我相信有更好的解决方案。

对此你怎么看,有没有更好的解决方案?

更新:

如果有人可以使用它,我使用的解决方案在我的回答中,我认为有更好的方法可以做到这一点,我会继续检查它,如果我发现任何问题,我会更新问题。

【问题讨论】:

【参考方案1】:

这是我使用的,对每条记录使用循环:

- (void) copyEntities:(NSString *)sourceEntity And:(NSString *)destinationEntity 
NSManagedObjectContext *context = [mainDelegate managedObjectContext];

NSEntityDescription *Units = [NSEntityDescription entityForName:sourceEntity inManagedObjectContext:context];
NSEntityDescription *BUnits = [NSEntityDescription entityForName:destinationEntity inManagedObjectContext:context];

NSFetchRequest *dataRequest = [[NSFetchRequest alloc] init];

[dataRequest setEntity:Units];

NSError *error = nil;

NSArray *dataArray = [context executeFetchRequest:dataRequest error:&error];

for (UnitsClass *unit in dataArray) 

    UnitsClass *savedUnits;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:BUnits];
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(code = %@)", unit.code];
    NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"(code2 = %@)", unit.code2];

    NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:pred, pred1, nil]];

    [request setPredicate:compoundPredicate];

    NSError *error = nil;

    NSArray *objects = [context executeFetchRequest:request error:&error];

    //this if to indicate if we inserting to the BUnits or updating it.
    if ([objects count] > 0) 
        //Found the record, update The info
        savedUnits = [objects objectAtIndex:0];
     else 
        savedUnits = [NSEntityDescription insertNewObjectForEntityForName:destinationEntity inManagedObjectContext:context];
    

    savedUnits.code = unit.code;
    /*Add your updated info*/

    NSError *errors;
    if (![context save:&errors]) 
        NSLog(@"Whoops, couldn't save: %@", [errors localizedDescription]);
    


NSLog(@"BUnits count = %d",[context countForFetchRequest:[NSFetchRequest fetchRequestWithEntityName:destinationEntity] error:&error]);

【讨论】:

【参考方案2】:

根据给定的信息,没有比循环每个单元对象并创建备份对象更好的方法了。

【讨论】:

感谢您的回复,我将使用我使用循环制作的解决方案更新问题,以防有人使用它。

以上是关于ios核心数据 - 将实体记录复制到另一个实体的主要内容,如果未能解决你的问题,请参考以下文章

entityframework克隆或将实体实例复制到另一个对象

将核心数据与 iCloud 同步 - 不包括实体

在ug里如何把一个实体复制成另一个,而且没有关联性

消息中间件核心实体

如何创建从一个实体到另一个现有实体的核心数据关系?

如何限制AzCopy从azure表存储中复制的实体数量?