4

コアデータ iPhone アプリを構築していますが、1 対多の関係データの取得に問題があります。説明しますので、しばらくお待ちください。

データ モデル デザイナーを使用して、「コメント」と呼ばれる多くのエンティティを含む「アイテム」と呼ばれるエンティティをセットアップしました。次に、複数のエンティティを取得して、UITableView. これらのエンティティを次のように取得します (viewDidLoadメソッド内):

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Items" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(Item_to_Areas.Name LIKE %@)",[areaManagedObject valueForKey:@"Name"]];
[request setPredicate:predicate];
[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"Item_to_item_comments"]];
NSLog(@"Results: %@", [mutableItemsFetchResults description]);
mutableItemsFetchResults = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy];
[request release];

ユーザーが行をタップすると、特定のエンティティが選択され、init メソッドで新しいテーブル ビュー コントローラーに渡され、新しいビュー コントローラーがスタックにプッシュされます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"itemObject: %@", [mutableItemsFetchResults objectAtIndex:indexPath.row]);
InspectionItemCommentsViewController *itemCommentsViewController =     [[InspectionItemCommentsViewController alloc]
                                                                initWithManagedObjectContext:self.managedObjectContext 
                                                                itemObject:[mutableItemsFetchResults objectAtIndex:indexPath.row]];
itemCommentsViewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:itemCommentsViewController animated:YES];
[itemCommentsViewController release];
}

最初のブロックの NSLog 出力は、"Item_to_item_comments" 関係エンティティが取得されたことを示していますが、2 番目のブロックでは、[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"Item_to_item_comments"]] を呼び出しても取得されていませんでした。

最初の NSLog 出力の一部を次に示します。

Results: (
"<NSManagedObject: 0xb356b70> (entity: Items; id: 0xb34fe60 <x-coredata://E43A90B5-AF0E- 4394-B4A7-5EFE74E181F8/Items/p1> ; data: {\n    Clean = nil;\n    Description = \"\";\n    ItemToInformation = \"<relationship fault: 0x5e1ef00 'ItemToInformation'>\";\n    \"Item_to_Areas\" = \"0xb33fd30 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Areas/p1>\";\n    \"Item_to_item_comments\" = \"<relationship fault: 0x5e1d300 'Item_to_item_comments'>\";\n    Keys = nil;\n    Name = Other;\n    \"Tenant_agrees\" = nil;\n    Undamaged = nil;\n    Working = nil;\n})",
"<NSManagedObject: 0xb35a930> (entity: Items; id: 0xb32acc0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Items/p2> ; data: {\n    Clean = nil;\n    Description = \"\";\n    ItemToInformation = \"<relationship fault: 0x790de40 'ItemToInformation'>\";\n    \"Item_to_Areas\" = \"0xb33fd30 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Areas/p1>\";\n    \"Item_to_item_comments\" =     (\n        \"0xb35bcb0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Item_Comments/p13>\",\n        \"0xb35bcd0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Item_Comments/p37>\",\n        \"0xb35bca0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Item_Comments/p5>\",\n        \"0xb35bcc0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Item_Comments/p26>\"\n    );\n    Keys = nil;\n    Name = Lights;\n    \"Tenant_agrees\" = nil;\n    Undamaged = nil;\n    Working = nil;\n})",

を含む Items エンティティがフェッチされていることがわかりますItem_to_item_comments。2 番目の NSLog は次のとおりです。

itemObject: <NSManagedObject: 0xe20af50> (entity: Items; id: 0xe209fc0 <x- coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Items/p2> ; data: {
    Clean = nil;
    Description = "";
    ItemToInformation = "<relationship fault: 0xe302e40 'ItemToInformation'>";
    "Item_to_Areas" = "0xe500b90 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Areas/p1>";
    "Item_to_item_comments" = "<relationship fault: 0xe302e60 'Item_to_item_comments'>";
    Keys = nil;
    Name = Lights;
    "Tenant_agrees" = nil;
    Undamaged = nil;
    Working = nil;

})

今、Item_to_item_comments障害です。同様に、プッシュされたビュー コントローラーでは、Items エンティティが渡されますが、渡されItem_to_item_commentsません。

明らかな何かが欠けていると思いますが、この問題に1日費やした後、それを理解できません。

どんな助けでも大歓迎です。

ピーター

4

1 に答える 1

9

「フォルト」はエラーを意味するのではなく、返されたオブジェクトがその属性が読み取られていない「ゴースト」であることを意味するだけです。フェッチを設定する必要がないため、関係の反対側でフォルトが発生するのは正常です。その関係を介してオブジェクト作成の制御されていないカスケードをオフにします。

障害の属性にアクセスすると、完全に機能するオブジェクトとして障害が発生します。

編集:

コメントから:

問題は、NSLog を介してそのような関係を要求していることですが、それでも関係エンティティを取得できません。

いいえ、そうではありません。Itemsエンティティ自体をリクエストしてからログに記録するだけです。期待どおり、彼らは関係に対して障害を返しています。関係の反対側にある実際のオブジェクトをそれぞれに要求した場合にのみ、障害の代わりにオブジェクトが表示されることが保証されます。

これは、リレーションシップ内のオブジェクトのフォルトインを強制するために必要なものです:

NSLog(@"itemObject.Item_to_item_comments: %@", [mutableItemsFetchResults objectAtIndex:indexPath.row].Item_to_item_comments.someAttribute]);

もう 1 つの問題は、2 つの個別のフェッチの結果を比較していることです。これ:

NSLog(@"Results: %@", [mutableItemsFetchResults description]);
mutableItemsFetchResults = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy];

...フェッチが発生するmutableItemsFetchResults 前にログに記録します。次の NSLog (おそらく) は、フェッチ後の結果を記録します。これは、2 つの異なる障害状態にある 2 つの異なるオブジェクト セットを見ている可能性があることを意味します。

mutableItemsFetchResultsは明らかにプロパティですが、self.mutableItemsFetchResults表記法を使用して適切に保持されていないため、問題が発生する可能性もあります。また、必要ないと思いますmutableCopy

于 2010-06-26T13:56:24.480 に答える