Erreur de relation CoreData?

J'ai un ordre qui a une relation "à plusieurs" avec les unités. Lorsque j'essaie d'save les unités (NSSet) dans l'ordre, j'obtiens une erreur de faute:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Order" inManagedObjectContext:mainContext]; [fetchRequest setEntity:entity]; NSArray *fetchedObjects = [mainContext executeFetchRequest:fetchRequest error:nil]; for (Order *order in fetchedObjects) { NSLog(@"%@", [order units]); break; } [fetchRequest release]; 

résulte en:

 Relationship 'units' fault on managed object (0x6d9dd00) <Order: 0x6d9dd00> (entity: Order; id: 0x6d88e40 <x-coredata://97A3F3D5-ABA7-499A-A460-5E25CF49C528/Order/p1> ; data: { composition = Hemlock; condition = ""; consignee = ""; consigneeCompanyName = ""; contactAlternatePhone = ""; contactEmail = ""; contactFirstName = ""; contactLastName = ""; contactPhone = ""; customer = "Havard Empire"; customerCompanyName = ""; customerNotes = ""; dateDue = "1/13/2012 12:00:00 AM"; dateEntered = "1/6/2012 12:00:00 AM"; dateOrdered = "1/6/2012 12:00:00 AM"; deliveryAddress1 = ""; deliveryAddress2 = ""; deliveryCity = ""; deliverySpecialInstructions = ""; deliveryState = ""; deliveryZip = ""; depth = 01; detail = ""; freightRate = ""; grade = Cull; instructionsDirectionsNotes = ""; lastUpdated = "1/6/2012 3:00:43 PM"; length = 01; location = "Lucedale, ms"; matsPerLoad = ""; memoLineNotes = ""; notes = ""; orderID = 201205134922479; orderNumber = 01062012; pUP = Cable; pricePerItem = ""; purchaseOrderNumber = ""; pushToQuickBooks = True; quantity = 0; quickbooksCompany = 1; salesman = "Accounting Adj"; separateRate = False; taxRate = ""; totalLoads = ""; type = "2ply Mat"; units = "<relationship fault: 0x6dacf20 'units'>"; vendorID = 10; width = 01; }) 

Les unités ne sont pas imprimées. Il dit "<relationship fault: 0x6dacf20 'units'>";

Aussi, pourquoi est-ce qu'il imprime l'object entier quand je veux seulement des unités?

Ce n'est pas une erreur – c'est une caractéristique des données de base appelée «faute». Voici la description d'Apple:

La faille réduit la quantité de memory consommée par votre application. Un défaut est un object réservé qui représente un object géré qui n'a pas encore été entièrement réalisé ou un object de collection qui représente une relation:

Un défaut d'object géré est une instance de la class appropriée, mais ses variables persistantes ne sont pas encore initialisées. Une erreur de relation est une sous-class de la class de collection qui représente la relation. Faulting permet aux données de base de mettre des limites sur le graphe d'objects. Parce qu'une erreur n'est pas réalisée, une faute d'object géré consum less de memory, et les objects gérés liés à un défaut n'ont pas besoin d'être représentés en memory du tout.

Si vous voulez voir chaque object Unité, vous devrez y accéder spécifiquement. Essayez ce qui suit:

 for (Order *order in fetchedObjects) { for (Unit *unit in [order units]) { NSLog(@"%@", unit); //I am not at a computer, so I cannot test, but this should work. You might have to access each property of the unit object to fire the fault, but I don't believe that is necessary. } } 

Pour voir tous les objects d'une relation «à plusieurs» , vous pouvez l'appeler avec la méthode allObjects du allObjects de la relation.

Dans votre cas spécifique, le code pour imprimer toutes les unités du premier ordre dans fetchedObjects serait comme ceci:

 for (Order *order in fetchedObjects) { NSLog(@"%@", [order.units allObjects]); break; } 

Dans Swift, ça irait comme ça:

 for order in fetchedObjects { for unit in order.units.allObjects as [Unit] { println(unit) } } 

Oui, j'avais aussi le même problème. Essayez simplement d'imprimer un champ de cette table, par exemple:

  for(Category *category in fetchedObjects) { for(Cards *card in category.cards) { NSLog(@"Question %@", card.question); NSLog(@"Card %@", card); } } 

C'est très contre-intuitif. Je me suis gratté la tête pendant environ une journée entière jusqu'à ce que je réalise que je ne peux pas imprimer tout l'object NSSet ou chaque object NSManagedObject dans l'set comme ceci:

 for (Order *order in fetchedObjects) { for (Unit *unit in [order units]) { NSLog(@"%@", unit); } } 

Cela générera une erreur dans xcode .. Mais si j'imprime chaque atsortingbut dans chaque NSMangedObject, c'est bien. Je suppose que Apple a des soucis de memory sur le chargement automatique de nombreux objects. Dans un scénario où il y a une string de relations trop nombreuses, cela va consumr beaucoup de memory. Donc besoin de paresseux-charger chaque atsortingbut.

 for (Order *order in fetchedObjects) { for (Unit *unit in [order units]) { NSLog(@"Unit Name : %@", unit.name); } } 

Cela imprimera le nom de l'unité ..