2011-05-24 21 views
6

İlişkilerle ilişkilendirilmiş dört ana öğeye sahip bir uygulama yazıyorum. Bazıları bire, bazıları bire birdir. İlk yüklemenin ardından, varlıklardan üçü verilerini yerel olarak depolanan XML dosyalarından yükler ve varlıklardan biri web'den bir XML indirir ve verilerini buradan yükler. Uygulama yüklendiğinde, bu dosyalardan her birinin verilerinin, sahip olduklarından daha güncel olup olmadığını kontrol etmek için bir kontrol gerçekleştirir ve eğer öyleyse, o dosyadaki tüm geçerli verileri uygun dosyadaki verilerle değiştirir.Temel Veri Varlığı İlişkisi Başlatılanlar Arasındaki Kaydetme Yok

Yazma sırasında hata ayıklama işlemimin bir parçası olarak, tüm verilerin silinmesini zorluyordum. Silme fonksiyonu çağrıldığında ve uygulama başlatıldığında tüm veriler yüklendiğinde, uygulama güzel çalışır ve tüm varlıklar ve ilişkiler tam olarak gerektiği gibi davranır. Ancak, silme işlevine çağrıyı kaldırdığımda, çekleri gerçekleştirir ve sakladığı veriyi çalıştırmaya çalışırsa, tüm ilişkiler kaybolur gibi görünür. Hata ayıklamada, tüm varlıkların, gereken tüm normal verileri içerdiğini buldum, artık yalnızca ilişkilere sahip değiller. Dünyadaki ilişkilerin neden ilk yükte saklandığını, ancak tüm verilerin yeniden içe aktarılmadığı zaman saklanmadığını anlayamıyorum.

Bazı kodların hata ayıklamalarına yardımcı olacağını düşünürdüm, ancak ne kadar eklemem gerektiğini bilmiyorum. Yani, veri yükleme sınıfında denilen yöntemlerden sadece birini dahil ederek başlayacağım. Başka bir şey yardımcı olursa, lütfen bana bildirin. Herhangi bir yardım çok takdir edilmektedir.

GÜNCELLEME KODU: 2/25/11 (Öneriler dayanarak - Problem hala var) GÜNCELLENEN KODU: 2/25/11 - çözüldü Sorun

- (NSArray *) loadFeatures { 

    if ([self checkForUpdate:@"Features"]) { 

     [self deleteAllObjects:@"Features"]; 

     NSString *filePath = [self dataFilePath:FALSE withResourceName:@"Features"]; 
     NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath]; 
     NSError *error; 
     GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error]; 

     NSArray *featureElements = [doc.rootElement elementsForName:@"FEATURE"]; 
     NSMutableSet *featureSections = [[NSMutableSet alloc] init]; 

     for (GDataXMLElement *featureElement in featureElements) { 

      NSString *featureName = nil; 
      NSNumber *featureSecure = nil; 
      NSNumber *featureID = nil; 
      NSNumber *featureSortKey = nil; 
      DisplayTypes *featureDisplayType = nil; 

      NSArray *names = [featureElement elementsForName:@"NAME"]; 
      if (names.count > 0) { 
       GDataXMLElement *firstName = (GDataXMLElement *) [names objectAtIndex:0]; 
       featureName = firstName.stringValue; 
      } else continue; 

      NSArray *secures = [featureElement elementsForName:@"SECURE"]; 
      if (secures.count > 0) { 
       GDataXMLElement *firstSecure = (GDataXMLElement *) [secures objectAtIndex:0]; 
       featureSecure = [NSNumber numberWithInt:firstSecure.stringValue.intValue]; 
      } else continue; 

      NSArray *featureIDs = [featureElement elementsForName:@"FEATUREID"]; 
      if (featureIDs.count > 0) { 
       GDataXMLElement *firstFeatureID = (GDataXMLElement *) [featureIDs objectAtIndex:0]; 
       featureID = [NSNumber numberWithInt:firstFeatureID.stringValue.intValue]; 
      } 

      NSArray *featureSortKeys = [featureElement elementsForName:@"SORTKEY"]; 
      if (featureSortKeys.count > 0) { 
       GDataXMLElement *firstSortKey = (GDataXMLElement *) [featureSortKeys objectAtIndex:0]; 
       featureSortKey = [NSNumber numberWithInt:firstSortKey.stringValue.intValue]; 
      } 

      NSArray *featureDisplays = [featureElement elementsForName:@"DISPLAYTYPEID"]; 
      if (featureDisplays.count > 0) { 
       GDataXMLElement *firstFeatureDisplay = (GDataXMLElement *) [featureDisplays objectAtIndex:0]; 

       for (DisplayTypes *thisDisplayType in self.displayTypes) { 
        if (thisDisplayType.displayTypeID == [NSNumber numberWithInt:firstFeatureDisplay.stringValue.intValue]) { 
         featureDisplayType = thisDisplayType; 
        } 
       } 
      } 

      NSArray *sectionElements = [featureElement elementsForName:@"SECTIONS"]; 


      for (GDataXMLElement *sectionElement in sectionElements) { 

       NSArray *sectionIDs = [sectionElement elementsForName:@"SECTION"]; 

       for (GDataXMLElement *sectionID in sectionIDs) { 
        NSArray *thisSectionIDs = [sectionID elementsForName:@"SECTIONID"]; 
        if ([thisSectionIDs count]) { 
         GDataXMLElement *thisSectionID = (GDataXMLElement *) [thisSectionIDs objectAtIndex:0]; 

         for (Sections *thisSection in self.sections) { 

          if ([thisSection.sectionID isEqualToNumber:[NSNumber numberWithInt:thisSectionID.stringValue.intValue]]) { 
           [featureSections addObject:thisSection]; 
          } 

         } 
        } 
       } 
      } 


      NSManagedObjectContext *context = [self managedObjectContext]; 
      NSManagedObject *featureInfo = [NSEntityDescription insertNewObjectForEntityForName:@"Features" inManagedObjectContext:context]; 
      [featureInfo setValue:featureName forKey:@"name"]; 
      [featureInfo setValue:featureSecure forKey:@"secure"]; 
      [featureInfo setValue:featureID forKey:@"featureID"]; 
      [featureInfo setValue:featureSortKey forKey:@"sortKey"]; 
      [featureInfo setValue:featureDisplayType forKey:@"display"]; 
      [[featureInfo mutableSetValueForKey:@"section"] unionSet:featureSections]; 

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

      [[self.managedObjectContext objectWithID:featureDisplayType.objectID] addFeatureObject:featureInfo]; 
      [self.managedObjectContext save:&error]; 

      [featureSections removeAllObjects]; 


     } 

     [xmlData release]; 
     [doc release]; 
     [featureSections release]; 

    } 

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

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Features" inManagedObjectContext:[self managedObjectContext]]; 
    [fetchRequest setEntity:entity]; 

    NSError *error; 
    NSArray *featureArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

    [fetchRequest release]; 

    return featureArray; 

} 

GÜNCELLEME: 5/25/2011

İstek üzerine, bir iki ekran görüntüsü yayınlıyorum.

1) Bu, tüm verilerden sonra app yükler silinmiş olduğunda ne alıyorum ve ilişkiler inceliğini olan

Data Loaded Properly

2) Bu benim uygulama ilk olmadan tekrar çalıştığında elde ediyoruz veri silme ve yeniden yükleme. Alttaki sekmeler, varlıklardan biri tarafından oluşturulur ve biraz farklı başlıklandırılır. Bu, DisplayType ile ilişkinin bulunmadığı ve hangi türden denetleyicinin yükleneceğini bilmediği ve sekme için hangi simgenin kullanılacağını bilmediği için olur.

Data Loaded - Relationships Missing

cevap

3

Genellikle, açıkça bir ilişkinin her iki tarafını ayarlamak gerek olmazdı. Çoktan bir ilişkiyle uğraşırken, koleksiyonun tamamını bir defada ayarlamak yerine, koleksiyona aynı anda bir öğe eklemek muhtemelen daha güvenlidir. Yani bunun yerine:

[featureInfo setValue:[NSSet setWithSet:featureSections] forKey:@"section"]; 

Ben, olur featureSections Set aracılığıyla döngü ve Feature varlığın section ilişkisine her tek tek nesne eklemek örn:

for (Sections *aSection in featureSections) { 
    // use the automatically-generated relationship mutator   
    [featureInfo addSectionsObject:aSection]; 
} 

umarım bu yardımcı olur .. Aksi halde, Apple belgelerinde this section belirtilebilir.

+0

Yanıt için teşekkür ederiz.Görebildiğim öneriyle ilgili tek sorun, featureInfo'nun Özellikler sınıfının değil, NSManagedObject sınıfının bir üyesi olduğunu ve bu nedenle, "addSectionsObject:" üye yöntemine sahip olmamasıdır - kesinlikle belgelere göz atacağım. – unclesol

+0

Bunu, nesnenin getirildiği ilk ekin altındaki kodda uygulamayı denedim. Bu özelliği ekran özelliği olarak yüklemek yerine setValue'yu o noktaya taşıdım. Ne yazık ki, bunun bir etkisi yok gibi görünüyor. – unclesol

+0

"NSManagedObject" örnekleriyle çalıştığınızda bile, "addSectionsObject:" gibi dinamik olarak oluşturulmuş erişimlere erişiminiz var. (Bir açıklama ve derleyici uyarılarının nasıl bastırılacağına bakın: http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154 -SW9). – octy