Подтвердить что ты не робот

Ошибка отношения CoreData?

У меня есть Order, который имеет отношение "to-many" к Units. Когда я пытаюсь зарегистрировать единицы (NSSet) в порядке, я получаю ошибку:

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

приводит к:

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

Единицы не печатаются. В нем говорится "<relationship fault: 0x6dacf20 'units'>";

Кроме того, почему он печатает весь объект, когда мне нужны единицы?

4b9b3361

Ответ 1

Это не ошибка - это функция Core Data, называемая "сбой". Вот описание Apple:

Неисправность уменьшает объем памяти, потребляемой вашим приложением. Ошибка - это объект-заполнитель, который представляет управляемый объект, который еще не полностью реализован, или объект коллекции, который представляет отношение:

Ошибка управляемого объекта - это экземпляр соответствующего класса, но его постоянные переменные еще не инициализированы. Ошибка отношения - это подкласс класса коллекции, который представляет отношение. Ошибка позволяет Core Data поставить границы на графе объектов. Поскольку ошибка не реализована, ошибка управляемого объекта потребляет меньше памяти, и управляемые объекты, связанные с ошибкой, вообще не обязательно должны быть представлены в памяти.

Если вы хотите увидеть каждый объект юнитов, вам нужно получить к ним определенный доступ. Попробуйте следующее:

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

Чтобы видеть все объекты отношения "ко многим" , вы можете вызвать его с помощью метода allObjects отношения NSSet.

В вашем конкретном случае код для печати всех единиц первого порядка в fetchedObjects будет выглядеть следующим образом:

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

Ответ 3

В Swift это будет выглядеть так:

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

Ответ 4

Да, у меня была та же проблема. Попробуйте просто напечатать некоторое поле этой таблицы, например:

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

Ответ 5

Это очень противоречиво. Я почесал голову почти целый день, пока не понял, что я не могу распечатать весь объект NSSet или каждый NSManagedObject в наборе, например:

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

Это приведет к сбою в xcode. Но если я распечатаю каждый атрибут в каждом объекте NSMangedObject, это нормально. Я предполагаю, что у Apple есть проблема с памятью по объектам Auto-loading to-many. В сценарии, где есть цепочка из многих отношений, он будет потреблять много памяти. Поэтому нужно lazy-load каждый атрибут.

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

Это напечатает название устройства.