web-dev-qa-db-fra.com

Erreur de relation CoreData?

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

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. Ça dit "<relationship fault: 0x6dacf20 'units'>";

Aussi, pourquoi imprime-t-il l'intégralité de l'objet alors que je ne veux que des unités?

43
0xSina

Ce n'est pas une erreur - c'est une fonctionnalité de Core Data appelée `` défaillante ''. Voici Apple description :

Les pannes réduisent la quantité de mémoire consommée par votre application. Un défaut est un objet d'espace réservé qui représente un objet géré qui n'a pas encore été entièrement réalisé, ou un objet de collection qui représente une relation:

Une erreur d'objet géré est une instance de la classe appropriée, mais ses variables persistantes ne sont pas encore initialisées. Une erreur de relation est une sous-classe de la classe de collection qui représente la relation. La défaillance permet à Core Data de délimiter le graphique de l'objet. Puisqu'une défaillance n'est pas réalisée, une défaillance d'objet géré consomme moins de mémoire et les objets gérés liés à une défaillance n'ont pas du tout besoin d'être représentés en mémoire.

Si vous voulez voir chaque objet 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.
    }
}     
85
sosborn

Pour voir tous les objets d'une relation "to-many" , vous pouvez l'appeler avec le allObjects méthode de la relation NSSet.

Dans votre cas spécifique, le code pour imprimer toutes les unités de la première commande dans fetchedObjects serait comme ceci:

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

Dans Swift cela se passerait comme suit:

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

Oui, j'ai aussi eu le même problème. Essayez simplement d'imprimer un champ de ce tableau, par exemple:

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

C'est très contre-intuitif. J'ai gratté ma tête pendant environ une journée entière jusqu'à ce que je réalise que je ne peux pas imprimer l'intégralité de l'objet NSSet ou chaque NSManagedObject dans l'ensemble comme suit:

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

Cela va générer un défaut dans xcode .. Mais si j'imprime chaque attribut dans chaque NSMangedObject, c'est très bien. Je suppose que Apple a des problèmes de mémoire concernant le chargement automatique d'objets trop nombreux. Dans un scénario où il y a une chaîne de relations trop nombreuses, cela consommera beaucoup de mémoire. Il faut donc paresseux -charger chaque attribut.

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

Cela imprimera le nom de l'unité ..

1
Lin