我有一对多的父子实体Book< - >>借
书
借
我希望使用子实体的最大NSFetchedResultsController
对NSDate
中的图书实体进行排序,以显示最近借来的图书。
我该怎么做?我尝试使用我自己的方法,使用类别书上
- (NSArray *)borrowSortedByborrowedDate
{
NSSortDescriptor *sortByCreatedDate = [NSSortDescriptor sortDescriptorWithKey:@"borrowDate" ascending:NO];
NSArray *sortedArray = [self.histories sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortByCreatedDate]];
return sortedArray;
}
- (NSDate *)recentBorrowDate
{
Borrow *borrow = [[self borrowSortedByborrowedDate] objectAtIndex:0];
return borrow.borrowDate;
}
并将其放入sortDescriptor
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"recentBorrowDate" ascending:YES];
但它不起作用。
这是我提取的请求(无效)
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"recentBorrowDate" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
我的预期结果是
答案 0 :(得分:0)
我有同样的问题,这是我目前的解决方法,以实现所需的输出。 (也许这是唯一的方法,但我仍在寻找...)
创建新的Borrow时,只需同时更新book.lastBorrowDate属性。
// Create new Borrow and set Book
Borrow *newBorrow = (Borrow *)[NSEntityDescription insertNewObjectForEntityForName:@"Borrow" inManagedObjectContext:self.managedObjectContext];
newBorrow.book = theBook;
newBorrow.borrowDate = [NSDate date];
newBorrow.note = theNote;
// Now also update our book's lastBorrowDate tracking property
theBook.lastBorrowDate = [NSDate date];
// Save all our changes
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
// Something went horribly wrong...
NSLog(@"Unresolved error: %@, %@, %@", error, [error userInfo],[error localizedDescription]);
abort(); // Fail
}
现在将它们拉出来之后很容易......
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastBorrowDate" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
答案 1 :(得分:0)
您可能会考虑将lastBorrowedDate
属性添加到Books托管对象的可能性。如果您想对此字段进行排序和搜索,则需要优化您的MOM以获得更高的效率。你也可以让代码更简单。
答案 2 :(得分:0)
我在类似的背景下实际上有类似的问题。您可以在此处查看帖子:Custom NSSortDescriptor on complex object
总而言之,我需要使用子属性和实体属性进行排序。找到的唯一解决方法是使用自定义排序描述符并在之后应用过滤器。这意味着你必须执行fetch,获取fetchResults,然后在数组中对它们进行排序。尽管如此,我最担心的是性能问题。在您的情况下,自定义排序可能类似于:
@interface Book(category) {}
@end
@implementation Book(category)
- (NSDate*)getMostRecentDate {
NSDate* mostRecentDate = [NSDate dateWithTimeIntervalSince1970:0];
for(Borrow* b in [self borrows]) {
mostRecentDate = [mostRecentDate laterDate:[b borrowDate]];
}
return mostRecentDate;
}
@end
@interface SortDescriptor : NSSortDescriptor {}
@end
@implementation SortDescriptor
- (id)copyWithZone:(NSZone*)zone
{
return [[[self class] alloc] initWithKey:[self key] ascending:[self ascending] selector:[self selector]];
}
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2
{
return [[(Book*)object1 getMostRecentDate] compare:[(Book*)object2 getMostRecentDate]];
}
@end
让我知道您对此解决方案的看法。我正在开始测试,以决定是否更改排序以使其更简单或使用NSArray。