2012-11-13 82 views
1

嘗試連載包括相關數據的NSManagedObjectNSDictionaryNSManagedObject to NSDictionary

我發現了一些代碼在這裏: http://vladimir.zardina.org/2010/03/serializing-archivingunarchiving-an-nsmanagedobject-graph/

不幸的是,爲NSOrderedSet不支持。試圖自己實現它,但有消息崩潰不承認選擇器線if (!relatedObject.traversed) {

- (NSDictionary*) toDictionary 
{ 
    self.traversed = YES; 

    NSArray* attributes = [[[self entity] attributesByName] allKeys]; 
    NSArray* relationships = [[[self entity] relationshipsByName] allKeys]; 
    NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithCapacity: 
           [attributes count] + [relationships count] + 1]; 

    [dict setObject:[[self class] description] forKey:@"class"]; 

    for (NSString* attr in attributes) { 
     NSObject* value = [self valueForKey:attr]; 

     if (value != nil) { 
      [dict setObject:value forKey:attr]; 
     } 
    } 

    for (NSString* relationship in relationships) { 
     NSObject* value = [self valueForKey:relationship]; 

     if ([value isKindOfClass:[NSSet class]]) { 
      // To-many relationship 

      // The core data set holds a collection of managed objects 
      NSSet* relatedObjects = (NSSet*) value; 

      // Our set holds a collection of dictionaries 
      NSMutableSet* dictSet = [NSMutableSet setWithCapacity:[relatedObjects count]]; 

      for (ExtendedManagedObject* relatedObject in relatedObjects) { 
       if (!relatedObject.traversed) { 
        [dictSet addObject:[relatedObject toDictionary]]; 
       } 
      } 

      [dict setObject:dictSet forKey:relationship]; 
     } 
     else if ([value isKindOfClass:[NSOrderedSet class]]) { 
      // To-many relationship 

      // The core data set holds a collection of managed objects 
      NSOrderedSet* relatedObjects = (NSOrderedSet *)value; 

      // Our set holds a collection of dictionaries 
      NSMutableSet* dictSet = [NSMutableSet setWithCapacity:[relatedObjects count]]; 

      for (ExtendedManagedObject* relatedObject in relatedObjects) { 
       if (!relatedObject.traversed) { 
        [dictSet addObject:[relatedObject toDictionary]]; 
       } 
      } 

      [dict setObject:dictSet forKey:relationship]; 
     } 
     else if ([value isKindOfClass:[ExtendedManagedObject class]]) { 
      // To-one relationship 

      ExtendedManagedObject* relatedObject = (ExtendedManagedObject*) value; 

      if (!relatedObject.traversed) { 
       // Call toDictionary on the referenced object and put the result back into our dictionary. 
       [dict setObject:[relatedObject toDictionary] forKey:relationship]; 
      } 
     } 
    } 

    return dict; 
} 


- (void) populateFromDictionary:(NSDictionary*)dict 
{ 
    NSManagedObjectContext* context = [self managedObjectContext]; 

    for (NSString* key in dict) { 
     if ([key isEqualToString:@"class"]) { 
      continue; 
     } 

     NSObject* value = [dict objectForKey:key]; 

     if ([value isKindOfClass:[NSDictionary class]]) { 
      // This is a to-one relationship 
      ExtendedManagedObject* relatedObject = 
       [ExtendedManagedObject createManagedObjectFromDictionary:(NSDictionary*)value 
                   inContext:context]; 

      [self setValue:relatedObject forKey:key]; 
     } 
     else if ([value isKindOfClass:[NSSet class]]) { 
      // This is a to-many relationship 
      NSSet* relatedObjectDictionaries = (NSSet*) value; 

      // Get a proxy set that represents the relationship, and add related objects to it. 
      // (Note: this is provided by Core Data) 
      NSMutableSet* relatedObjects = [self mutableSetValueForKey:key]; 

      for (NSDictionary* relatedObjectDict in relatedObjectDictionaries) { 
       ExtendedManagedObject* relatedObject = 
        [ExtendedManagedObject createManagedObjectFromDictionary:relatedObjectDict 
                    inContext:context]; 
       [relatedObjects addObject:relatedObject]; 
      } 
     } 
     else if (value != nil) { 
      // This is an attribute 
      [self setValue:value forKey:key]; 
     } 
    } 
} 
+0

假設你附帶的調試器,你得到了什麼樣的對象,如果你檢查'relatedObject'是引發異常運行? – Tommy

+0

你在哪一點得到例外?你有沒有描述你得到的例外情況? –

+0

@RamyAlZuhouri CoreFoundation'- [NSObject(NSObject)doesNotRecognizeSelector:]: – Shmidt

回答

2

它是快速和簡便的方法

NSMutableArray *array = [NSMutableArray arrayWithCapacity:ManagedObjectItems.count]; 
[[ManagedObjectItems allObjects] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    Diary_item_food *food = obj; 
    NSArray *keys = [[[food entity] attributesByName] allKeys]; 
    NSDictionary *dict = [obj dictionaryWithValuesForKeys:keys]; 
    [array addObject:dict]; 
}]; 
+0

正如我正確的關係不導出? – Shmidt

+0

@PeterSmith它用於NSJSONSerialization –

0

更簡單的方法,請查詢的objectID和提取請求使用NSDictionaryResultType。

更新:僅當您不需要相關數據時。

+2

它不提取關係數據。 – shrishaster

+0

你是對的,我已經更新了原始問題,以澄清他需要的相關數據。 – malhal