2013-07-23 14 views
5

Po zapisaniu danych (10 rekordów) do podmiotu, jestem przetwarzania żądania pobierał, aby wszystkie dane ponownie:udało wartość obiektu jest losowo zerowy (projekt próbki w zestawie)

//Saving data 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 

    //Save to coredata 


     song = [NSEntityDescription insertNewObjectForEntityForName:@"Song" 
              inManagedObjectContext:context]; 
     [song setValue:title forKey:@"title"]; 

     [song setValue:songLink forKey:@"songWebLink"]; 
     NSLog(@"Song link : %@",songLink);//Never get NULL 


     [song setValue:albumLink forKey:@"albumImageLink"]; 

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

      NSLog(@"Record saved correctly"); 
     } 
} 

Zapisywanie powyżej działa poprawnie i Debugowałem bardzo uważnie wszystkie dane przed zapisaniem w kontekście, aby upewnić się, że żaden z atrybutów nie jest NULL.

Problem jest zawsze z atrybutem songWebLink, czasami robi się zerowa, gdy próbuję ot dostać go z powrotem poniżej:

- (void)parserDidEndDocument:(NSXMLParser *)parser{ 

    NSEntityDescription *songEntity=[NSEntityDescription entityForName:@"Song" inManagedObjectContext:context]; 
    NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
    [fetch setEntity:songEntity]; 
    NSError *fetchError; 
    NSArray *fetchedSongs=[context executeFetchRequest:fetch error:&fetchError]; 

    NSMutableArray *songs = [[NSMutableArray alloc] init]; 

    for (NSManagedObject *songObject in fetchedSongs) { 
    //here is the issue: this for loop will go through 10 iterations, songWebLink is randomly NULL, sometimes it's the fourth iteration, sometimes the 8th, sometimes the 5th. 
     NSLog(@"song web link: %@",[songObject valueForKey:@"songWebLink"]);//albumImageLink and title attributes are fine 
    } 
} 

Kwestia jest taka, że ​​kiedy NSLog się songWebLink, robi NULL, gdy dla 4. iteracja, potem 6, potem 2 itd. Przy pobieraniu losowo przypisuje wartość NULL do atrybutu. Podczas zapisywania danych upewniam się, że nie ma wartości NULL dla songWebLink. Więc postawię na coś innego, co jest przyczyną tego problemu.

Jakieś myśli?

EDIT

Oto jak MOC jest inicjowany:

AppDelegate.m:

- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (_managedObjectContext != nil) { 
     return _managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     _managedObjectContext = [[NSManagedObjectContext alloc] init];//I tried initWithConcurrencyType:NSMainQueueConcurrencyType 
     [_managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return _managedObjectContext; 
} 

Pierwsze MOC obiektu użyć go w innej klasie:

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate]; 
context = [appDelegate managedObjectContext]; 

Przykładowy projekt: Jeśli uważasz, że musisz rzucić okiem na projekt aplikacji, stworzyłem uproszczoną wersję, na której powieliłem błąd, możesz go pobrać here.

+0

Za dużo zapisujesz kontekst. Może to powoduje problem. Stworzyłem 'NSManagedObject' w' parser: didEndElement: namespaceURI: qualifiedName: 'i zapisałem je wszystkie raz w' parserDidEndDocument: '. – Desdenova

+0

Cześć, myślałem o tym już i przetestowałem, ale też nie działało. – Malloc

+1

Spróbuj ustawić właściwość 'songWebLink' na zakodowany ciąg znaków. Jeśli problem zniknie, przyjrzyj się bliżej faktycznym wartościom. Jedyne, co mogę wymyślić, to upewnić się, że używasz kontekstu i jego obiektów w kolejce powiązanej z kontekstem. Problemy z wątkami mogą pojawiać się losowo. –

Odpowiedz

0

Po wielu dniach próbuję to rozgryźć, wybrałem opcję MagicalRecord, ponieważ upraszcza ona wiele przynoszących ból głowy. Jeśli ktokolwiek mógłby rozwiązać problem i pomóc mi, uznaję jego odpowiedź za zaakceptowaną.

0

spróbuj tego:

włączenia tego w twojej żądanie pobierania

[fetch setIncludesPropertyValues:YES]; 

iterację zwracanych obiektów, takich jak ten:

for (Song *songObject in fetchedSongs) { 
    //here is the issue: this for loop will go through 10 iterations, songWebLink is randomly NULL, sometimes it's the fourth iteration, sometimes the 8th, sometimes the 5th. 
    NSLog(@"song web link: %@",songObject.songWebLink);//albumImageLink and title attributes are fine 
} 

nie jestem 100% pewien, że to wola napraw to, ale pomoże w znalezieniu problemu, jeśli tak się nie stanie.

0

Wygląda na to, że cały czas pracujesz na komputerze głównym, więc nie sądzę, że istnieje problem z wątkiem/kontekstem.

Prawdopodobnie typ danych zwrócony przez analizator składni XML nie jest zgodny z typem danych CoreData.

Zamiast zalogowaniu tak:

NSLog(@"Song link : %@",songLink);//Never get NULL 

try:

NSLog(@"Song link : %@",[song valueForKey:@"songWebLink"]); 
NSLog(@"Song link class : %@",[songLink class]); 

Założę zaczniesz widzieć swoje zerowe wartości w pierwszym rejestrze. Drugi dziennik z nadzieją powie ci, która klasa jest zwracana przez analizator składni XML.Musisz odpowiednio się z tym postarać.

Powiązane problemy