web-dev-qa-db-ja.com

CoreData関係の障害?

ユニットと「多対多」の関係にある注文があります。 Orderでユニット(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'>";

また、ユニットのみが必要なときにオブジェクト全体を印刷するのはなぜですか?

43
0xSina

これはエラーではありません-これは「フォールト」と呼ばれるCore Dataの機能です。 Appleの 説明 は次のとおりです。

フォールティングは、アプリケーションが消費するメモリ量を削減します。障害は、まだ完全には実現されていない管理対象オブジェクトを表すプレースホルダーオブジェクト、または関係を表すコレクションオブジェクトです。

管理対象オブジェクトフォールトは適切なクラスのインスタンスですが、その永続変数はまだ初期化されていません。関係障害は、関係を表すコレクションクラスのサブクラスです。フォールティングにより、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.
    }
}     
85
sosborn

"to-many" 関係のすべてのオブジェクトを見るために、関係のallObjectsNSSetメソッドでそれを呼び出すことができます。

特定のケースでは、fetchedObjectsの最初の Order のすべての Units を印刷するコードは次のようになります。

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

Swiftでは次のようになります。

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

はい、私も同じ問題を抱えていました。次の例のように、このテーブルの一部のフィールドを印刷してみてください。

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

これは非常に直感的ではありません。 NSSetオブジェクト全体またはセット内の各NSManagedObjectを次のように印刷できないことに気づくまで、約1日頭を悩ましました。

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

ユニット名が出力されます。

1
Lin