2013-07-23 4 views
5

Nach Daten (10 Datensätze) zu einer Einheit zu speichern, ich bin der Verarbeitung einer Abrufanforderung alle Daten wieder zu bekommen:verwaltete Objektwert zufällig null ist (Beispielprojekt enthalten)

//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"); 
     } 
} 

oben Speichern funktioniert gut und Ich habe alle Daten sehr sorgfältig überprüft, bevor sie im Kontext gespeichert wurden, um sicherzustellen, dass keines der Attribute NULL ist.

Das Problem ist immer mit dem songWebLink Attribute, manchmal wird es null, wenn ich versuche es ot wieder unter:

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

Das Problem ist, dass, wenn ich die songWebLinkNSLog, es NULL wird, einmal für die 4. Iteration, dann für 6., dann 2. etc. Es wird NULL einem Attribut beim Abrufen zufällig zugewiesen. Beim Speichern von Daten vergewissere ich mich, dass kein Wert NULL für songWebLink vorliegt. Also wette ich auf etwas anderes, um die Ursache dieses Problems zu sein.

Irgendwelche Gedanken?

EDIT

Hier ist, wie die MOC initialisiert wird:

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; 
} 

MOC Objekt bekommen es in einer anderen Klasse zu verwenden:

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

Beispielprojekt: Wenn Sie denken, dass Sie sich das App-Projekt ansehen müssen, habe ich eine vereinfachte Version erstellt, auf der ich den Fehler reproduziert habe. Sie können ihn herunterladen: here.

+0

Sie speichern den Kontext zu sehr. Vielleicht verursacht das das Problem. Ich würde das 'NSManagedObject' bei' parser: didEndElement: namespaceURI: qualifiedName: 'erstellen und sie alle einmal in' parserDidEndDocument: 'speichern. – Desdenova

+0

Hallo, ich habe schon darüber nachgedacht und es getestet, aber auch nicht funktioniert. – Malloc

+1

Versuchen Sie, die 'songWebLink'-Eigenschaft auf eine fest codierte Zeichenfolge zu setzen. Wenn das Problem nicht mehr auftritt, sehen Sie sich die tatsächlichen Werte genauer an. Das einzige, was mir noch einfällt, ist, dass Sie den Kontext und seine Objekte in der Warteschlange verwenden, die mit dem Kontext verknüpft sind. Threading-Probleme können zufällig erscheinen. –

Antwort

0

Nach Tagen versucht, dies herauszufinden, wählte ich für MagicalRecord gehen, da es eine Menge von Kopfschmerzen zu erleichtern. Wenn jemand das Problem herausfinden und mir helfen könnte, werde ich seine Antwort als die akzeptierte betrachten.

0

Geben Sie diesem einen Versuch:

diese Fügen Sie in Ihrer Anfrage

[fetch setIncludesPropertyValues:YES]; 

Iterate durch die zurückgegebenen Objekte wie folgt holen:

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 
} 

Ich bin nicht 100% sicher, dass dies behebe es, aber es wird helfen, das Problem zu finden, wenn es nicht funktioniert.

0

Vom Aussehen her, laufen Sie die ganze Zeit auf Main, also glaube ich nicht, dass es ein Threading/Kontext-Problem gibt.

Es ist wahrscheinlich, dass der vom XML-Parser zurückgegebene Datentyp nicht mit dem CoreData-Datentyp übereinstimmt.

Statt wie dies der Protokollierung:

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

Versuch:

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

Ich wette, Sie werden sehen, Ihre Nullwerte im ersten Protokoll starten. Das zweite Protokoll wird Ihnen hoffentlich sagen, welche Klasse tatsächlich vom XML-Parser zurückgegeben wird.Sie müssen damit umgehen.