framework español objective-c ios cocoa-touch core-data

objective-c - framework - cocoa touch español



¿Error de relación de CoreData? (5)

Tengo una orden que tiene una relación de "muchos" con las unidades. Cuando trato de registrar las unidades (NSSet) en orden, obtengo un error de falla:

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

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

Las unidades no están impresas. Dice "<relationship fault: 0x6dacf20 ''units''>";

Además, ¿por qué está imprimiendo todo el objeto cuando solo quiero unidades?


En Swift iría así:

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


Esto es muy contrario a la intuición. Me rasqué la cabeza durante todo un día hasta que me di cuenta de que no podía imprimir todo el objeto NSSet o cada NSManagedObject en el conjunto de la siguiente manera:

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

Esto generará un error en xcode. Pero si imprimo cada atributo en cada NSMangedObject, está bien. Supongo que a Apple le preocupa la memoria sobre la carga automática de muchos objetos. En un escenario donde hay una cadena de muchas relaciones, consumirá mucha memoria. Por lo tanto, es necesario cargar perezoso cada atributo.

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

Eso imprimirá el nombre de la unidad.


Esto no es un error, es una característica de Core Data llamada ''faulting''. Aquí está la description de Apple:

Las fallas reducen la cantidad de memoria que consume su aplicación. Un error es un objeto de marcador de posición que representa un objeto gestionado que aún no se ha realizado del todo, o un objeto de recopilación que representa una relación:

Un error de objeto gestionado es una instancia de la clase apropiada, pero sus variables persistentes aún no se han inicializado. Un error de relación es una subclase de la clase de recopilación que representa la relación. La falla permite que los Datos principales pongan límites en el gráfico del objeto. Debido a que no se realiza un error, un error de objeto gestionado consume menos memoria, y no es necesario que los objetos gestionados relacionados con un error se representen en la memoria.

Si desea ver cada objeto de la Unidad, tendrá que acceder específicamente a ellos. Pruebe lo siguiente:

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


Para ver todos los objetos de una relación "muchos" , puede llamarlo con el método allObjects del allObjects de la relación.

En su caso específico, el código para imprimir todas las Unidades del primer Pedido en fetchedObjects sería así:

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


Sí, también tuve el mismo problema. Intente imprimir un campo de esta tabla, por ejemplo:

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