2011-02-06 36 views
1

我想讓代碼中加載多個實體更易於管理。下面的代碼附加到一個可以加載1000次以上的對象,所以我把它放在一個循環中並附加了一個可管理的實體數組。如何循環加載核心數據中多個實體的數據,代碼量最少?

問題是,因爲我不知道單個對象中是否有可用的密鑰,所以當我在董事實體上時,我遇到了[singleObject valueForKey:@「actor」]的崩潰。這是因爲關鍵的「演員」不存在。在這裏看到我的代碼。

NSArray *entities = [[NSArray alloc] initWithObjects: @"actors", @"directors", @"subtitles", @"audios", nil]; 

for (NSString *anEntity in entities) 
{ 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:anEntity inManagedObjectContext:context]; 
    [request setEntity:entityDescription]; 
    NSArray *objects = [context executeFetchRequest:request error:&error]; 
    if (objects == nil) { 
     // error 
    } 

    for (NSManagedObject *singleObject in objects) 
    { 
     if (singleObject != nil) 
     { 
      if ([singleObject valueForKey:@"actor"] != nil) 
      { 
       [self.actors addObject:[singleObject valueForKey:@"actor"]]; 
      } 
      else if ([singleObject valueForKey:@"director"] != nil) 
      { 
       [self.directors addObject:[singleObject valueForKey:@"director"]]; 
      } 
      else if ([singleObject valueForKey:@"subtitle"] != nil) 
      { 
       [self.subtitles addObject:[singleObject valueForKey:@"subtitle"]]; 
      } 
      else if ([singleObject valueForKey:@"audio"] != nil) 
      { 
       [self.audios addObject:[singleObject valueForKey:@"audio"]]; 
      } 
     } 
    } 
} 

[entities release]; 
[request release];' 

我怎樣才能讓這段代碼的工作,並大幅擴張,而不必把一幫嘗試/漁獲物周圍的一切?

回答

2

好吧我想我找到了一種適用於我使用NSDictionary的方法。它只適用於我的情況,因爲我的實體名稱是複數(演員),我的屬性是單數(演員)。以下是我想出了:

NSMutableDictionary *entities = [[NSMutableDictionary alloc] init]; 
[entities setValue:actors forKey:@"actors"]; 
[entities setValue:directors forKey:@"directors"]; 
[entities setValue:subtitles forKey:@"subtitles"]; 
[entities setValue:audios forKey:@"audios"]; 

for (NSMutableString *aKey in entities) 
{ 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:aKey inManagedObjectContext:context]; 
    [request setEntity:entityDescription]; 
    NSArray *objects = [context executeFetchRequest:request error:&error]; 
    if (objects == nil) { 
     // error 
    } 

    for (NSManagedObject *singleObject in objects) 
    { 
     if (singleObject != nil) 
     { 
      if ([singleObject valueForKey:[aKey substringToIndex:[aKey length] - 1]] != nil) 
      { 
       [[entities valueForKey:aKey] addObject:[singleObject valueForKey:[aKey substringToIndex:[aKey length] - 1]]]; 
      } 
     } 
    } 
} 

詳情:

通過在字典中的鑰匙丟循環。我讓它們變化,這樣我就可以把鑰匙關掉。然後我從該鍵中取出數值(這是一個數組),並使用沒有s的鍵加載數組。

閱讀代碼有些複雜,但是確實減少了可管理性。現在我需要做的就是添加一個新的複數實體,並匹配單數屬性,並將鍵/值對添加到字典中。

0

我不知道這是否會對您有所幫助,因爲我並不十分清楚您正在嘗試做什麼,但是在將數據從MySQL數據庫導入到CoreData時,我遇到了類似的問題。我廣泛使用了NSEntityDescription 的方法propertiesByName,attributesByNamerelationshipsByName。在我的情況下,使用MySQL表中的字段描述,我確定我的模型屬性與字段名稱匹配,所以不需要做大量的if/else測試,我只是進行了代碼測試,以確定[[SomeEntityDescription attributesByName] valueForKey:someFieldName]是否返回了某些內容除了零。如果是這樣,我使用字段名稱作爲關鍵字,從導入的數據中爲我創建的對象設置值。

你可以爲你的關係做類似的事情。如果我通過檢查[someEntityDescription relationshipsByName]鍵來了解您正在嘗試正確執行的操作,或者,您可以使用relationshipsWithDestinationEntity:(NSEntityDescription *)entity獲得所有關注您的感興趣實體的關係。