1

NotificationGroupおよびの 3 つのエンティティを持つコア データ モデルがありCustomerます。それらの間の関係は次のとおりです。

  • 顧客は多くのグループに属し、グループは多くの顧客を持つことができます。
  • 通知はグループに送信 (所属) され、グループは多数の通知を受信 (保持) できます。

顧客ごとにグループ化されたすべての通知を表示したいと思いUITableViewます。私はこのようなものを作成しましたNSFetchedResultsController:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.fetchBatchSize = 10;
fetchRequest.predicate = nil;

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Notification"
                                          inManagedObjectContext:self.managedObjectContext];
fetchRequest.entity = entity;

// Default sort descriptors are built in a separate custom method
NSArray *sortDescriptors = [self getDefaultSortDescriptorsForEntity:entity];
fetchRequest.sortDescriptors = sortDescriptors;

return [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                           managedObjectContext:self.managedObjectContext
                    sectionNameKeyPath:@"group.customers.firstName"
                             cacheName:nil];

これが顧客ごとにグループ化されたすべての通知を取得する有効な方法であると仮定すると (それについてもよくわかりません)、iOS は次の例外をスローします。

@"Failed to fetch all Notification objects"
@"Reason: Invalid to many relationship in setPropertiesToFetch: (group.customers.firstName) (NSInvalidArgumentException)"

何かが欠けていて、すべてが正しいように見えるかどうかを確認するために、関係を何度も見直しました。すべてのエンティティのオブジェクトを作成および削除でき、それらの間のリンクも正しいです。

私の質問は次のとおりですsectionNameKeyPath。値内の複数の関係をトラバースすることは可能ですか? この種のシナリオでは、多対多の関係をどのように処理する必要がありますか?

4

1 に答える 1

2

はい、できます。FRC を使用して顧客を取得し、 を に設定するだけsectionNameKeyPathですnil

セクション
返される結果の数は、セクションの数です。セクション ヘッダーに顧客データを入力します。


セクションの行数は になりますcustomer.notifications.count。行にデータを入力するには、何らかの方法 (日付順など) で並べ替えられていることを確認し、notificationsそれに応じて次のように表示します。

NSArray *orderedNotifications = 
  [customerForSection.notifications sortedArrayUsingDescriptors:
   @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]]];
Notification *notificationToBeDisplayed = 
   [orderedNotifications objectAtIndex:indexPath.row];

別の (推奨される) 解決策は、データ モデルを変更することです。通知をすべての顧客に直接関連付けることができます。これには、グループ メンバーシップが変更された場合でも、通知が正しい顧客に関連付けられたままになるという利点があります。

于 2013-01-31T14:48:35.200 に答える