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 songWebLink
NSLog
, 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.
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
Hallo, ich habe schon darüber nachgedacht und es getestet, aber auch nicht funktioniert. – Malloc
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. –