3

私は1対多の親子エンティティを持っています本<->>借りる

  • 名前
  • 借りる(関係)

かりて

  • BorrowDate
  • ノート
  • 本(関係)

NSFetchedResultsController子エンティティの最大数を使用してBookエンティティを並べ替えて、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];

私の期待する結果は

  • 書籍名1(今日のborrowDate)
  • 書籍名2(昨日borrowDate)
  • 書籍名3(何日も前のborrowDate)
4

3 に答える 3

0

私は同じ問題を抱えており、これが目的の出力を達成するための現在の回避策です。(多分これが唯一の方法ですが、私はまだ探しています...)

新しい借入を作成するときは、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];
于 2012-05-24T12:10:39.197 に答える
0

lastBorrowedDateBooks管理対象オブジェクトにプロパティを追加する可能性を検討するかもしれません。このフィールドで並べ替えと検索を行う場合は、効率を上げるためにMOMを最適化する必要があります。また、コードをより単純にすることもできます。

于 2012-05-29T13:53:55.177 に答える
0

私は実際に同様の状況で同様の問題を抱えています。ここで投稿をチェックできます:複雑なオブジェクトのカスタムNSSortDescriptor

要約すると、子属性とエンティティ属性の両方を使用して並べ替える必要があります。見つかった唯一の回避策は、カスタムの並べ替え記述子を使用し、後でフィルターを適用することです。つまり、フェッチを実行し、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を使用するかを決定するためのテストを開始しています。

于 2012-06-25T21:54:27.673 に答える