Core data 如何在其他NSManagedObject上下文中插入NSManagedObject?

Core data 如何在其他NSManagedObject上下文中插入NSManagedObject?,core-data,magicalrecord,Core Data,Magicalrecord,我从服务器获取数据并将其转换为NSManagedObject对象数组。 该数组用于显示表 如何在持久存储中插入第一个元素数组人 - (void)viewDidLoad { [self loadData]; [self insertFirstPeople]; } - (NSManagedObjectContext *)managedObjectContext { if(!_managedObjectContext) _managedObjectContext = [N

我从服务器获取数据并将其转换为NSManagedObject对象数组。 该数组用于显示表

如何在持久存储中插入第一个元素数组

- (void)viewDidLoad
{
     [self loadData];
     [self insertFirstPeople];
}

- (NSManagedObjectContext *)managedObjectContext
{
    if(!_managedObjectContext) _managedObjectContext = [NSManagedObjectContext MR_context];
    return _managedObjectContext;
}

- (void)loadData
{
    ... 
       Network Request
    ...
    peoples = [NSMutableArray array];
    for (NSDictionary *item in items)
    {
        People *people = [Podcast MR_createInContext:self.managedObjectContext];
        people.name = [item valueForKeyPath:@"im:name.label"];
        [peoples addObject:people];
    }
}

-(void)insertFirstPeople
{
    People *people = peoples[0];
    NSManagedObjectContext *moc = [NSManagedObjectContext MR_defaultContext];
    [moc insertObject:people]
    [moc MR_saveToPersistentStoreAndWait];
}
错误:

An NSManagedObject may only be in (or observed by) a single NSManagedObjectContext.

我自己已经找到了解决这个问题的办法

-(void)insertFirstPeople
{
    People *people = peoples[0];
    CoreDataHelper *helper = [[CoreDataHelper alloc] init];
    NSManagerObjectContext *context = [NSManagedObjectContext MR_defaultContext];
    [helper saveObject:people toContext:context];
    [context MR_saveOnlySelfAndWait];
}
CoreDataHelper.h

#import <Foundation/Foundation.h>


@interface CoreDataHelper : NSObject
{
    NSMutableDictionary* _lookup;
}
@property(nonatomic, retain) NSMutableDictionary *lookup;

-(void)saveFrom:(NSManagedObjectContext *)current to:(NSManagedObjectContext *)parent;

- (NSManagedObject *)saveObject:(NSManagedObject *)object toContext:(NSManagedObjectContext *)moc;

- (NSManagedObject*)copyObject:(NSManagedObject*)object
                     toContext:(NSManagedObjectContext*)moc
                        parent:(NSString*)parentEntity;
@end

您是否打算使用两种不同的托管对象上下文?是否确实只希望在默认上下文中插入第一个People对象?在背景环境中创建的其他对象呢?是的。我想使用两种上下文。第一个仅用于构建表,第二个用于保存持久性存储OK,但您想将所有人员对象保存到持久性存储还是仅保存第一个对象?仅保存第一个对象可能比较困难/不可能。您可以将对象从一个上下文传输到另一个上下文(例如,使用
[people MR_inContext:[NSManagedObjectContext MR_defaultContext]]
),但这仅在对象已保存的情况下有效。保存背景上下文将保存所有对象。更准确地说,由于背景上下文是默认上下文的子上下文,因此保存背景上下文意味着将所有插入的对象插入到默认上下文中。
#import "CoreDataHelper.h"

@implementation CoreDataHelper

@synthesize lookup = _lookup;

-(void)saveFrom:(NSManagedObjectContext *)current to:(NSManagedObjectContext *)parent
{
    NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
          [dnc addObserverForName:NSManagedObjectContextDidSaveNotification
                           object:current queue:nil
                       usingBlock:^(NSNotification *notification)
         {
           [parent mergeChangesFromContextDidSaveNotification:notification];
         }];
        NSError *error;
        if (![current save:&error])
          {
              NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
          }

          [dnc removeObserver:self
                         name:NSManagedObjectContextDidSaveNotification
                       object:current];
}


- (NSManagedObject *)saveObject:(NSManagedObject *)object toContext:(NSManagedObjectContext *)moc {
    NSUndoManager *docUndoMgr = [moc undoManager];
    [docUndoMgr beginUndoGrouping];

    NSManagedObject *object2 = [self copyObject:object toContext:moc parent:nil];

    [moc processPendingChanges];
    [docUndoMgr endUndoGrouping];
    return object2;
}

- (NSManagedObject *)copyObject:(NSManagedObject *)object
                      toContext:(NSManagedObjectContext *)moc
                         parent:(NSString *)parentEntity; {
    NSError *error = nil;
    NSString *entityName = [[object entity] name];
    NSManagedObject *newObject = nil;
    if ([moc objectRegisteredForID:object.objectID])
        newObject = [moc objectWithID:object.objectID];
    else
        newObject = [NSEntityDescription
                insertNewObjectForEntityForName:entityName
                         inManagedObjectContext:moc];


    if (![moc save:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

    [[self lookup] setObject:newObject forKey:[object objectID]];

    NSArray *attKeys = [[[object entity] attributesByName] allKeys];
    NSDictionary *attributes = [object dictionaryWithValuesForKeys:attKeys];

    [newObject setValuesForKeysWithDictionary:attributes];

    id oldDestObject = nil;
    id temp = nil;
    NSDictionary *relationships = [[object entity] relationshipsByName];
    for (NSString *key in [relationships allKeys]) {

        NSRelationshipDescription *desc = [relationships valueForKey:key];
        NSString *destEntityName = [[desc destinationEntity] name];
        if ([destEntityName isEqualToString:parentEntity]) continue;

        if ([desc isToMany]) {

            NSMutableSet *newDestSet = [NSMutableSet set];

            for (oldDestObject in [object valueForKey:key]) {
                temp = [[self lookup] objectForKey:[oldDestObject objectID]];
                if (!temp) {
                    temp = [self copyObject:oldDestObject
                                  toContext:moc
                                     parent:entityName];
                }
                [newDestSet addObject:temp];
            }

            [newObject setValue:newDestSet forKey:key];

        } else {
            oldDestObject = [object valueForKey:key];
            if (!oldDestObject) continue;

            temp = [[self lookup] objectForKey:[oldDestObject objectID]];
            if (!temp && ![destEntityName isEqualToString:parentEntity]) {
                temp = [self copyObject:oldDestObject
                              toContext:moc
                                 parent:entityName];
            }

            [newObject setValue:temp forKey:key];
        }
    }

    return newObject;
}

@end