4
  1. Items エンティティと Tags エンティティがあります。
  2. アイテムは複数のタグを持つことができ、タグは複数のアイテムにリンクできます (多対多の関係)。
  3. この関係は、双方向の「順序付けられた関係」(IOS5 で順序付けられた関係を使用) です。

NSFetchedResultsController を使用して、タグのすべてのアイテムを取得したいと考えています。

クエリ:

  1. NSFetchRequest と NSFetchedResultsController で順序付き関係を使用することは可能ですか?
  2. 「ソート記述子」を指定するにはどうすればよいですか?
  3. 2つの述語を試しました。最初のものは結果を与えませんでしたが、2番目のものは結果を与えました。最初のものはなぜ機能しないのですか?この関係で CoreData によって自動的に管理される並べ替え順序を使用するには、並べ替え記述子をどのように指定すればよいでしょうか。

うまくいきませんでした: [NSPredicate predicateWithFormat:@"ANY tags == %@", yyy];

うまくいきました:しかし効率が悪い:[NSPredicate predicateWithFormat:@"ANY tags.tagID == %@", xxx];

4

1 に答える 1

2

1 - はい。可能です。マッピング ファイルを作成するときは、次のように、リレーションシップのタイプを NSSet から NSArray に変更してください。

    @class Tags

    @interface Entity : NSManagedObject
    ...
    @property (nonatomic, retain) NSOrderedSet *tags;
    ...
    @end

    @interface Entity (CoreDataGeneratedAccessors)
    ...
    - (void)addEntityTags:(NSOrderedSet *)values;
    - (void)removeEntityTags:(NSOrderedSet *)values;
    ...
    @end

への変更:

    @class Tags

    @interface Entity : NSManagedObject
    ...
    @property (nonatomic, retain) NSArray *tags;
    ...
    @end

    @interface Entity (CoreDataGeneratedAccessors)
    ...
    - (void)addEntityTags:(NSArray *)values;
    - (void)removeEntityTags:(NSArray *)values;
    ...
    @end

2 - 次のように、フェッチ要求を作成するときにソート記述子を指定できます。

    NSFetchRequest *fetchRequest [NSFetchRequest new];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:myManagedObjectContext];

    [fetchRequest.setEntity: entity];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"tags" ascending:<YES|NO>]];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY tags == %@", yyy]];

    NSFetchResultsController *myFetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:myManagedObjectContext setcionNameKeyPath:nil cacheName:nil];
    myFetchResultsController.delegate = self;

    [fetchRequest release]; // Forget that if using ARC.

    NSError *error = nil;

    if (![myFetchResultsController performFetch:&error]) {
        NSLog(@"Failed to fetch data: %@", error);
    }

3 - プロパティを使用する場合、タグの述語を指定する必要はありません。タグをさらに並べ替えたい場合は、次のように、その配列で並べ替え記述子を使用するだけです。

    NSSortDescriptor *tagDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"<tags field to sort on>" ascending:<YES|NO>];
    NSArray *sortedTags = [tagsProperty sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptors]];

タグのプロパティから簡単に読み取ることができます。

お役に立てれば!

于 2012-09-04T12:22:47.703 に答える