-2

Core Dataを使い始めたばかりで、これがどのように機能するかわかりません。基本的に、Personエンティティとalarmエンティティがあります。一人一人が多くのアラームを持つことができます。私が欲しいのは、personオブジェクトのdetailViewControllerに移動して、それらのアラームを確認することです。NSSetはソートされていないため、次のようにソートされたアラームを返すメソッドがあります。

- (NSArray *)sortedTimes {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Alarm" inManagedObjectContext:self.managedObjectContext];
    [request setEntity:entity];

    NSSortDescriptor *timeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"time" ascending:YES selector:@selector(compare:)];
    [request setSortDescriptors:@[timeDescriptor]];

    NSError *error = nil;
    NSArray *objects = [self.managedObjectContext executeFetchRequest:request error:&error];

    // Can I do this???
    //self.person.alarms = [NSSet setWithArray:objects];

//    for (NSManagedObject *obj in objects) {
//        NSDate *date = [obj valueForKey:@"time"];
//        NSLog(@"date: %@", [date description]);
//    }
    return objects;
}

私が疑問に思っているのは、その行self.person.alarms = [NSSet setWithArray:objects];でそれは大丈夫ですか?実際に何が起こっているのかよくわかりません。executeFetchRequestは、必要なオブジェクトの配列を返します。先に進んで、それを個人エンティティのアラームプロパティに割り当てることはできますか?Person-> Alarmから、いじってはいけない関係があるのか​​、それともこのようなものが完全に合法なのかはわかりませんでした。ありがとう!

4

1 に答える 1

1

まず、フェッチリクエストは、のアラームだけでなく、すべてのアラームを返しますself.person。フェッチ要求に述語を追加する必要があります。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"person = %@", self.person];
[request setPredicate:predicate];

(これがAlarmエンティティからPersonpersonエンティティへの逆の関係であると仮定します)。しかし、人のソートされたアラームを取得するために、フェッチ要求は実際には必要ありません。より直接的な方法は

NSArray *objects = [[self.person.alarms allObjects]
                              sortedArrayUsingDescriptors:@[timeDescriptor]];

今あなたの質問に:ステートメント

self.person.alarms = [NSSet setWithArray:objects];

同じアラームのセットをその人に再割り当てするだけです。これは同じセットであるため、実質的に何も変更されません。self.person.alarms特に、それが時間でソートされることを保証するものではありません。

備考:人のアラームを含むテーブルビューを表示したい場合は、NSFetchedResultsControllerテーブルビューのデータソースとして(FRC)を使用することもできます。FRCを使用する利点は、オブジェクトが挿入、削除、または更新されると、テーブルビューが自動的に更新されることです。

必要なすべてのコードテンプレートを含むドキュメントをご覧NSFetchedResultsControllerください。NSFetchedResultsControllerDelegate

于 2013-01-27T09:20:52.767 に答える