【发布时间】:2014-09-02 11:13:59
【问题描述】:
如图所示,我有两个实体。我需要获取一个特定的约会和所有未删除与会者的相关与会者(hasDeleted != 1)。我尝试过不同的谓词格式。以下是我尝试过的两个主要谓词,但无法使这些谓词中的任何一个起作用。你能帮我解决这个问题吗?
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"objectName = %@ AND objectId = %i AND SUBQUERY(attendees, $x, $x.hasDeleted != 1).@count != 0", [self.userDefaults stringForKey:OBJECT_NAME], [[self.userDefaults objectForKey:OBJECT_ID] intValue]];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"objectName = %@ AND objectId = %i AND (ANY attendees.hasDeleted != 1)", [self.userDefaults stringForKey:OBJECT_NAME], [[self.userDefaults objectForKey:OBJECT_ID] intValue]];
约会列表表格视图
可以查看与会者详细信息的详细约会视图。
获取结果控制器代码:
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Attendee" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"uuid" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"appointment.objectName = %@ AND appointment.objectId = %i AND hasDeleted != 1", [self.userDefaults stringForKey:OBJECT_NAME], [[self.userDefaults objectForKey:OBJECT_ID] intValue]];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}
【问题讨论】:
-
您是否有任何错误记录到控制台? “objectId = %i”可以改成“objectId = %@”并传递一个NSNumber对象(那么就不需要将它转换为int)。您不需要子查询,第二个应该可以工作。
-
您是否尝试过“一个接一个”地使用您的谓词?我的意思是,划分所有的和/或/子查询,看看是否能得到你想要的。然后一点一点的组合起来。
-
@thom_ek 没有错误。它只是返回所有与会者而不过滤第二个。
-
@thom_ek 还有什么想法吗?
-
@Larme 你是说分别尝试 AND、OR、SUBQUERY 吗?
标签: ios core-data nspredicate one-to-many