2012-01-16 17 views
40

Tengo una orden que tiene una relación de "muchos" con las unidades. Cuando intento acceder las unidades (nsset) en orden, me sale un error de errores:¿Error de relación de CoreData?

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

no se imprimen las unidades. Dice "<relationship fault: 0x6dacf20 'units'>";

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

Respuesta

80

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

Faulting reduces the amount of memory your application consumes. A fault is a placeholder object that represents a managed object that has not yet been fully realized, or a collection object that represents a relationship:

A managed object fault is an instance of the appropriate class, but its persistent variables are not yet initialized. A relationship fault is a subclass of the collection class that represents the relationship. Faulting allows Core Data to put boundaries on the object graph. Because a fault is not realized, a managed object fault consumes less memory, and managed objects related to a fault are not required to be represented in memory at all.

Si desea ver cada objeto Unidad entonces tendrá que acceder a ellos específicamente. Intente 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. 
    } 
}  
+2

Gracias por la respuesta, pero no funciona. Intenté esto antes. – 0xSina

+0

¿Qué le muestra en el registro cuando lo hace de esta manera? – sosborn

+0

Nada. no itera a través del segundo ciclo. Verifico el conteo y devuelve cero. – 0xSina

3

Sí, también tuve el mismo problema. Trate sólo imprimir algún campo de esta tabla, en el ejemplo:

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

Para ver todos los objetos de una "a muchos" relación, se le puede llamar con el método allObjects de la relación NSSet.

En su caso específico, el código para imprimir todas las Unidades de la primera Solicitar en fetchedObjects sería así:

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

En Swift se iría así:

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

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

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

Esto generará fallo 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); 
    } 
} 

que imprimirá el nombre de la unidad ..

Cuestiones relacionadas