使用 NSPredicate 在特定对象中的核心数据 NSFetchRequest

Core Data NSFetchRequest within specific object using NSPredicate

我有一个核心数据实体,"Entity 1" 它与另一个实体 "Entity 2".

有一个一对多的关系,让我们称它为 "entityRelationship"

我希望能够执行与 NSFetchResultsController 一起使用的 NSFetchRequest 到 return 特定 "Entity 1" 对象的 "Entity 2" 对象列表。

我将 "Entity 1" 存储为它自己的变量,但我似乎无法找到为 return 对象设置 NSPredicate 的正确方法:

这是我的代码:

 NSFetchedResultsController *fetchedEvents;
    NSFetchRequest *fetchRequest;
    NSError *error = nil;

    fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Entity2"];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"Entity2 IN self = %@",entity1Object]];
    [fetchRequest setSortDescriptors:@[]];// no sort descriptors
    fetchedEvents = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:theManagedObjectContext sectionNameKeyPath:nil cacheName:nil];
    [fetchedEvents performFetch:&error];

    if (error) {
        NSLog(@"Unable to perform fetch.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }
    return fetchedEvents;

此崩溃并出现以下错误:

** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "NSMDEvents IN self = %@"'

我是不是做错了什么?或者这是处理 return 具有关系的实体的不正确方法?

由于您有 entity1Object 和定义的关系,您可以直接从那里检索 Entity2 对象

NSSet *entity2Objects = [entity1Object valueForKey:@"entityRelationship"];

不需要额外的提取。


但是如果你真的需要获取定义反向关系并使用具有唯一值的属性。

例如,假设 entity1clubsentity2 是他们的 members,并且您想让特定俱乐部的所有成员使用此谓词:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Member"];    
[NSPredicate predicateWithFormat:@"club.name == %@", currentClub.name];

谓词中的文字club为反向关系对象

或者翻译成你的例子

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Entity2"];    
[NSPredicate predicateWithFormat:@"entity1.property == %@", entity1Object.property];

尝试建议的代码(感谢 vadian)一直导致我的应用程序崩溃,并出现有关密钥不存在等各种错误,结果证明这是关系问题。

"Entity2" 继承自另一个实体(在数据模型检查器中设置了其父实体字段)"Entity 0"。然而 "Entity1" 之间的关系是其自身与 "Entity0" 之间的关系,而不是 "Entity2".

因此,在对核心数据模型进行重新调整后,"Entity2" 在自身与 "Entity1" 之间添加了一个关系(我们称之为 "EntityEvents")。现在使用以下代码,我能够 select 来自当前对象的特定事件:

 NSFetchedResultsController *fetchedEvents;
    NSFetchRequest *fetchRequest;
    NSError *error = nil;

    fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Entity2"];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"EntityEvents == %@",Entity1]];
    [fetchRequest setSortDescriptors:@[]];// no sort descriptors
    fetchedEvents = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:theManagedObjectContext sectionNameKeyPath:nil cacheName:nil];
    [fetchedEvents performFetch:&error];

    if (error) {
        NSLog(@"Unable to perform fetch.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }

    return fetchedEvents;