1

私のコアデータは次のように定義されています。ユーザーには多くのイベントがあります。イベントには単一のユーザー関係があります。

ユーザーとイベントはどちらもコア データ エンティティです。ユーザー エンティティは、ストーリーボード セグエを介して渡されます。

その特定のユーザーのイベントのみを使用して、そのユーザーの詳細 UITableView を設定するように NSPredicate を構成しようとしています。

これまで私は試してきました

//does not work
 NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"user == %@",self.appUser];

//does not work
 NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"SELF.user == %@",self.appUser];

イベントを比較して、指定されたユーザー オブジェクトと等しいユーザー オブジェクトを持つイベントのみを返す適切な構文は何ですか?

アップデート:

この種のフェッチされた結果コントローラーを使用して、ユーザーにイベントを追加できるようにしようとしています:

-(NSFetchedResultsController*)fetchedResultsController
{
    if (__fetchedResultsController != nil) {
        return __fetchedResultsController;
    }

    // Set up the fetched results controller.
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:[Event managedObjectContext]];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

//I need to configure this user
    NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"user = %@",self.appUser];


    // The first sort key must match the section name key path key if present, otherwise the initial dataset would be messed up: rows in incorrect sections

    NSString* firstSortKey = @"createDate";
    NSSortDescriptor *firstSortDescriptor = [[NSSortDescriptor alloc] initWithKey:firstSortKey ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:firstSortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setPredicate:onlyThisUserPredicate];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[Event managedObjectContext] sectionNameKeyPath:nil cacheName:@"Events"];
    self.fetchedResultsController = aFetchedResultsController;
    aFetchedResultsController.delegate = self;

    //    [aFetchedResultsController release];
    [sortDescriptors release];
    [fetchRequest release];

    NSError *error = nil;
    if (![__fetchedResultsController performFetch:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        //      abort();
    }


    return __fetchedResultsController;
}

ありがとうございました!

4

3 に答える 3

1

OK、この動作の原因と考えられることがいくつかあります。

まず、この関数内の self.appUser の値を検証しましたか? 期待どおりに設定されていますか?

次に、ヘッダーがすべて最新で、このファイルに含まれていることを確認しましたか? ヘッダーがコアデータ モデルに対応していない場合、奇妙な動作が発生することがあります。

于 2012-04-27T18:56:49.233 に答える
1

つまり、この述語は User エンティティに対するものです。正しいですか? もしそうなら、あなたはこれを試しましたか:

NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"SELF == %@",self.appUser];

次に、次の方法でイベントにアクセスできます。

[self.appUser events];
于 2012-04-27T18:28:47.017 に答える
0

Core Dataストアから「ユーザー」をすでに取得している場合は、その関係に従うだけでそのイベントにアクセスできるはずです。別のフェッチ要求を行う必要はありません。

NSSet *events = self.appUser.events;

一方、self.appUserが管理対象オブジェクトでない場合は==、述語で演算子を使用することがおそらく問題になります。self.appUserしたがって、これはユーザーの名前を含む単なる文字列であり、データストアのユーザーオブジェクトではないと仮定します。次に、述語で「like」演算子を使用します。

NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"user like %@",self.appUser];

また、フェッチリクエストで適切なエンティティを指定していることを確認してください。説明した内容については、イベントエンティティのエンティティの説明を使用してフェッチを実行する必要があります。

于 2012-04-27T18:21:38.757 に答える