【问题标题】:CoreData relationship fault?CoreData 关系故障?
【发布时间】:2012-02-11 04:06:41
【问题描述】:

我有一个与单位有“对多”关系的订单。当我尝试按顺序记录单位(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;
})

不打印单位。它说"&lt;relationship fault: 0x6dacf20 'units'&gt;";

另外,当我只需要单位时,为什么要打印整个对象?

【问题讨论】:

    标签: objective-c ios cocoa-touch core-data


    【解决方案1】:

    这不是错误——它是 Core Data 的一个特性,称为“故障”。这是苹果的description

    故障会减少您的应用程序消耗的内存量。一种 fault 是一个占位符对象,代表一个托管对象 还没有完全实现,或者是一个集合对象 表示关系:

    托管对象故障是适当类的实例,但是 它的持久变量尚未初始化。关系错误 是集合类的子类,表示 关系。故障允许 Core Data 在 对象图。因为一个故障没有实现,一个托管对象故障 消耗更少的内存,并且与故障相关的托管对象不是 完全需要在内存中表示。

    如果您想查看每个 Unit 对象,则必须专门访问它们。请尝试以下操作:

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

    【讨论】:

    • 感谢您的回复,但它不起作用。我以前试过这个。
    • @0xSina 我也有同样的问题。我的计数返回 0。你是如何解决这个问题的?
    • @0xSina 你能和我们分享一下.. 你是怎么解决这个错误的 我也面临这个问题
    • 另外,您可以调用关系属性的allObjects 方法来打印它们,而无需迭代它们并访问它们的任何属性。
    • 错误听起来像是有人为单词 placeholder 选择了错误的占位符。
    【解决方案2】:

    是的,我也遇到了同样的问题。 尝试仅打印此表的某些字段,例如:

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

    【讨论】:

      【解决方案3】:

      为了查看“to-many”关系的所有对象,您可以使用allObjects方法调用它关系的NSSet

      在您的具体情况下,打印fetchedObjects 中第一个 Order 的所有 Units 的代码如下:

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

      【讨论】:

        【解决方案4】:

        在 Swift 中是这样的:

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

        【讨论】:

          【解决方案5】:

          这是非常反直觉的。我挠了挠头大约一整天,直到我意识到我不能像这样打印出整个 NSSet 对象或集合中的每个 NSManagedObject :

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

          这将在 xcode 中产生错误。但是如果我打印出每个 NSMagedObject 中的每个属性,那就没问题了。我猜苹果对自动加载多个对象有内存问题。在存在多对多关系链的场景中,它会消耗大量内存。所以需要延迟加载每个属性。

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

          这将打印出单位名称..

          【讨论】:

            猜你喜欢
            • 2015-02-18
            • 1970-01-01
            • 1970-01-01
            • 2016-10-22
            • 1970-01-01
            • 2013-01-16
            • 1970-01-01
            • 1970-01-01
            • 2011-08-01
            相关资源
            最近更新 更多