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

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

42 голосов
/ 16 января 2012

У меня есть Орден, который имеет отношение ко многим с Юнитами. Когда я пытаюсь зарегистрировать единицы (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'>";

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

Ответы [ 5 ]

85 голосов
/ 16 января 2012

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

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

Ошибка управляемого объекта является экземпляром соответствующего класса, но его постоянные переменные еще не инициализированы. Ошибка в отношениях является подклассом класса коллекции, который представляет отношения. Ошибка позволяет 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.
    }
}     
9 голосов
/ 18 февраля 2014

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

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

for (Order *order in fetchedObjects) {
    NSLog(@"%@", [order.units allObjects]);
    break;
}
5 голосов
/ 24 февраля 2015

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

for order in fetchedObjects {
    for unit in order.units.allObjects as [Unit] {
        println(unit)
    }
}
3 голосов
/ 19 мая 2012

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

    for(Category *category in fetchedObjects) 
    {
        for(Cards *card in category.cards) 
        {
            NSLog(@"Question %@", card.question);
            NSLog(@"Card %@", card);
        }
    }
1 голос
/ 22 января 2016

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

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

Это вызовет ошибку в xcode. Но если я распечатаю каждый атрибут в каждом NSMangedObject, это нормально. Я думаю, у Apple есть проблемы с памятью из-за автоматической загрузки многих объектов. В сценарии, в котором существует цепочка отношений «многие ко многим», он потребляет много памяти. Так что нужно лениво загружать каждый атрибут.

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

Это выведет имя устройства ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...