与 NSfetchedresultscontroller 的一对多关系
One to many relationship with NSfetchedresultscontroller
我在从一对多关系中获取对象时遇到问题。
我有两个实体 "Featured" 和 "Event",特色对象包含一个 属性 个 featuredEvents,这是一对多关系,一个 "Featured" 项到多个 "Events".
现在我需要使用 NSFetchedResultsController 来 return "featuredEvents" 关系中的事件。我正在使用以下代码:
NSFetchedResultsController *fetchedFeaturedEvents;
NSFetchRequest *fetchRequest;
NSError *error = nil;
fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"SDMFeaturedEvent"];
[fetchRequest setSortDescriptors:@[]];
fetchedFeaturedEvents = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:theManagedObjectContext sectionNameKeyPath:nil cacheName:nil];
[fetchedFeaturedEvents performFetch:&error];
if (error) {
NSLog(@"Unable to perform fetch.");
NSLog(@"%@, %@", error, error.localizedDescription);
}
return fetchedFeaturedEvents;
这在 return 特色活动中很棒,但我也希望仅向 return "featuredEvents" 属性 中的活动添加谓词。所以问题是我如何创建谓词?
我基本上需要 "Featured" 对象的 featuredEvents 属性 中的所有 "Events" 我正在为其获取,这可能吗?
对于那些一直有类似问题的人,我最终使用了这种方法:
NSFetchRequest *fetchRequest;
NSError *error = nil;
NSArray *fetchedObjects;
NSPredicate *soldOutPredicate;
NSPredicate *criteriaMatchPredicate;
NSCompoundPredicate *fullPredicate;
NSSortDescriptor *usesDescriptor = [[NSSortDescriptor alloc] initWithKey:@"eventDate" ascending:YES];
fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FeaturedEvent"];
[fetchRequest setSortDescriptors:@[]];
fetchedObjects = [theManagedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@"Unable to perform fetch.");
NSLog(@"%@, %@", error, error.localizedDescription);
}
if ([[NSSDMUserDetails sharedManager]showsCriteraMatchEvents]) {
if ([[NSSDMUserDetails sharedManager]isUserMale]) {
criteriaMatchPredicate = [NSPredicate predicateWithFormat:@"(eventAgeMaleMin <= %@) AND (eventAgeMaleMax >= %@)",[[[NSSUserDetails sharedManager]userAge]stringValue],[[[NSUserDetails sharedManager]userAge]stringValue]];
}
else{
criteriaMatchPredicate = [NSPredicate predicateWithFormat:@"(eventAgeFemaleMin <= %@) AND (eventAgeFemaleMax >= %@)",[[[NSUserDetails sharedManager]userAge]stringValue],[[[NSUserDetails sharedManager]userAge]stringValue]];
}
fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[criteriaMatchPredicate]];
}
if (![[NSSDMUserDetails sharedManager]showsSoldOutEvents]) {
if ([[NSSDMUserDetails sharedManager]isUserMale]) {
soldOutPredicate = [NSPredicate predicateWithFormat:@"eventPlacesMale == %@ || eventPlacesMale != %@",@"in stock",@"0"];
}
else{
soldOutPredicate = [NSPredicate predicateWithFormat:@"eventPlacesFemale == %@ || eventPlacesFemale != %@",@"in stock",@"0"];
}
fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[soldOutPredicate]];
}
if (soldOutPredicate && criteriaMatchPredicate) {
fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[soldOutPredicate,criteriaMatchPredicate]];
}
if (fetchedObjects && fetchedObjects.count > 0) {
SDMFeaturedEvent *feat = [fetchedObjects objectAtIndex:0];
NSLog(@"All featured events %@",feat.featuredEvents);
if (fullPredicate) {
return [[feat.featuredEvents.allObjects filteredArrayUsingPredicate:fullPredicate]sortedArrayUsingDescriptors:@[usesDescriptor]];
}
else if (![[NSSDMUserDetails sharedManager]showsCriteraMatchEvents]){
return [feat.featuredEvents.allObjects sortedArrayUsingDescriptors:@[usesDescriptor]];
}
else{
return [NSArray new];
}
}
return [NSArray new];
诀窍是 return 来自 featuredEvent "featuredEvents" 属性 的事件数组,然后您可以 运行 filteredArrayUsingPredicate 和 sortedArrayUsingDescriptor 方法对事件对象进行排序在数组中,无论您有什么要求。当然,这不是 returning NSFetchedResultsController,但这对过滤非常有用。
我在从一对多关系中获取对象时遇到问题。 我有两个实体 "Featured" 和 "Event",特色对象包含一个 属性 个 featuredEvents,这是一对多关系,一个 "Featured" 项到多个 "Events".
现在我需要使用 NSFetchedResultsController 来 return "featuredEvents" 关系中的事件。我正在使用以下代码:
NSFetchedResultsController *fetchedFeaturedEvents;
NSFetchRequest *fetchRequest;
NSError *error = nil;
fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"SDMFeaturedEvent"];
[fetchRequest setSortDescriptors:@[]];
fetchedFeaturedEvents = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:theManagedObjectContext sectionNameKeyPath:nil cacheName:nil];
[fetchedFeaturedEvents performFetch:&error];
if (error) {
NSLog(@"Unable to perform fetch.");
NSLog(@"%@, %@", error, error.localizedDescription);
}
return fetchedFeaturedEvents;
这在 return 特色活动中很棒,但我也希望仅向 return "featuredEvents" 属性 中的活动添加谓词。所以问题是我如何创建谓词?
我基本上需要 "Featured" 对象的 featuredEvents 属性 中的所有 "Events" 我正在为其获取,这可能吗?
对于那些一直有类似问题的人,我最终使用了这种方法:
NSFetchRequest *fetchRequest;
NSError *error = nil;
NSArray *fetchedObjects;
NSPredicate *soldOutPredicate;
NSPredicate *criteriaMatchPredicate;
NSCompoundPredicate *fullPredicate;
NSSortDescriptor *usesDescriptor = [[NSSortDescriptor alloc] initWithKey:@"eventDate" ascending:YES];
fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FeaturedEvent"];
[fetchRequest setSortDescriptors:@[]];
fetchedObjects = [theManagedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@"Unable to perform fetch.");
NSLog(@"%@, %@", error, error.localizedDescription);
}
if ([[NSSDMUserDetails sharedManager]showsCriteraMatchEvents]) {
if ([[NSSDMUserDetails sharedManager]isUserMale]) {
criteriaMatchPredicate = [NSPredicate predicateWithFormat:@"(eventAgeMaleMin <= %@) AND (eventAgeMaleMax >= %@)",[[[NSSUserDetails sharedManager]userAge]stringValue],[[[NSUserDetails sharedManager]userAge]stringValue]];
}
else{
criteriaMatchPredicate = [NSPredicate predicateWithFormat:@"(eventAgeFemaleMin <= %@) AND (eventAgeFemaleMax >= %@)",[[[NSUserDetails sharedManager]userAge]stringValue],[[[NSUserDetails sharedManager]userAge]stringValue]];
}
fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[criteriaMatchPredicate]];
}
if (![[NSSDMUserDetails sharedManager]showsSoldOutEvents]) {
if ([[NSSDMUserDetails sharedManager]isUserMale]) {
soldOutPredicate = [NSPredicate predicateWithFormat:@"eventPlacesMale == %@ || eventPlacesMale != %@",@"in stock",@"0"];
}
else{
soldOutPredicate = [NSPredicate predicateWithFormat:@"eventPlacesFemale == %@ || eventPlacesFemale != %@",@"in stock",@"0"];
}
fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[soldOutPredicate]];
}
if (soldOutPredicate && criteriaMatchPredicate) {
fullPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[soldOutPredicate,criteriaMatchPredicate]];
}
if (fetchedObjects && fetchedObjects.count > 0) {
SDMFeaturedEvent *feat = [fetchedObjects objectAtIndex:0];
NSLog(@"All featured events %@",feat.featuredEvents);
if (fullPredicate) {
return [[feat.featuredEvents.allObjects filteredArrayUsingPredicate:fullPredicate]sortedArrayUsingDescriptors:@[usesDescriptor]];
}
else if (![[NSSDMUserDetails sharedManager]showsCriteraMatchEvents]){
return [feat.featuredEvents.allObjects sortedArrayUsingDescriptors:@[usesDescriptor]];
}
else{
return [NSArray new];
}
}
return [NSArray new];
诀窍是 return 来自 featuredEvent "featuredEvents" 属性 的事件数组,然后您可以 运行 filteredArrayUsingPredicate 和 sortedArrayUsingDescriptor 方法对事件对象进行排序在数组中,无论您有什么要求。当然,这不是 returning NSFetchedResultsController,但这对过滤非常有用。