使用 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"];
不需要额外的提取。
但是如果你真的需要获取定义反向关系并使用具有唯一值的属性。
例如,假设 entity1
是 clubs
,entity2
是他们的 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;
我有一个核心数据实体,"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"];
不需要额外的提取。
但是如果你真的需要获取定义反向关系并使用具有唯一值的属性。
例如,假设 entity1
是 clubs
,entity2
是他们的 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;