2012-01-16 10 views
40

私はユニットと「多対多の」関係を持つオーダーを持っています。私が注文に単位(NSSet)をログに記録しようとすると、私は、障害のエラーが表示されます。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]; 

結果で:ユニットは印刷されません

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'>";

また、私はユニットが欲しいときにオブジェクト全体を印刷している理由は何ですか?

答えて

80

これはエラーではなく、「フォールティング」と呼ばれるコアデータの機能です。ここでは、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.

あなたは、各ユニットのオブジェクトを表示したい場合は、あなたがそれらを特異的にアクセスする必要があります。以下を試してみてください:

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

おかげで、それは動作しません。私はこれを前に試しました。 – 0xSina

+0

このようにすると、ログには何が表示されますか? – sosborn

+0

何もありません。 2番目のループを反復しません。私は数をチェックし、ゼロを返します。 – 0xSina

3

私も同じ問題がありました。単なる例では、この表の一部のフィールドを印刷してみ :

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

ためにに「多」関係のすべてのオブジェクトを参照してください、あなたはallObjects方法でそれを呼び出すことができますその関係のNSSetのあなたの特定のケースで

fetchedObjectsに最初注文のすべて単位を印刷するためのコードは次のようになります:スウィフトで

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

それはそうのように行くだろう:

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

これは非常に直観的です。私はそうのようなセットで全体NSSetオブジェクトまたは各NSManagedObjectをプリントアウトすることができないことを実現するまで私は約一日のために私の頭の傷:

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

これはXcodeで障害が発生します..しかし、私はプリントアウトした場合各NSMangedObject内の各属性は、それは問題ありません。 Appleには、多くのオブジェクトへの自動読み込みに比べてAppleの懸念があると思います。多対多関係の連鎖があるシナリオでは、多くのメモリを消費します。したがって、各属性を遅延ロードする必要があります。

for (Order *order in fetchedObjects) { 
    for (Unit *unit in [order units]) { 
     NSLog(@"Unit Name : %@", unit.name); 
    } 
} 
ユニット名を印刷します

...返信用