2013-08-07 2 views
1

서버에서 데이터를 가져와 NSManagedObject 개체의 배열로 변환합니다. 배열은 테이블을 표시하는 데 사용됩니다.NSManagedObjectContext 다른 NSManagedObjectContext 삽입하는 방법?

첫 번째 요소 배열을 삽입하는 방법 사람들을 영구 저장소에 삽입 하시겠습니까?

- (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. 
+0

은 두 개의 서로 다른 관리되는 개체 컨텍스트를 사용하도록 의도인가? 기본 컨텍스트에 * first * People 객체 만 삽입하고 싶습니까? 배경 컨텍스트에서 생성 된 다른 객체는 어떻습니까? –

+0

예. 두 가지 상황을 사용하고 싶습니다. 테이블을 만드는 유일한 방법은 영구 저장소 – user2168735

+0

을 저장하는 두 번째 방법입니다.하지만 모든 * 사람 개체를 영구 저장소 또는 * 첫 번째 개체에 저장 하시겠습니까? –

답변

0

.

-(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 

CoreDataHelper.m

#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 
관련 문제