2

私の述語は、メッセージUnsupported function expressionでアプリをクラッシュさせ続けますFUNCTION(SELF, "filterDistanceWithLatitude:" , latitude, longitude)。誰かがこれを修正する方法を知っていますか?

- (void)setUpFetchedResultsController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"NextTime"]; //Retrieve data for the place entity
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]]; //How to sort it
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.context sectionNameKeyPath:nil cacheName:nil]; //Puts the data in a NSFetchedResultsController which is oddly located in CoreDataTableViewController //Puts the data in a NSFetchedResultsController which is oddly located in CoreDataTableViewController
    self.filtered = self.fetchedResultsController.fetchedObjects;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FUNCTION(self, 'filterByDistanceWithLatitude:', latitude, longtitude) > 20"];
    self.filtered = [self.filtered filteredArrayUsingPredicate:predicate];
}

- (double)filterByDistanceWithLatitude:(NSNumber *)latitude andLongitude:(NSNumber *)longitude
{
    CLLocationDegrees latitudeCoor = [latitude doubleValue]; //Puts the latitude into a NextTime object.
    CLLocationDegrees longitudeCoor = [longitude doubleValue]; //Puts the longtitude into a NextTime object.

    CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:latitudeCoor longitude:longitudeCoor];
    CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:self.currentLocation.latitude longitude:self.currentLocation.longitude];

    NSNumber *distance = [[NSNumber alloc] initWithDouble:[loc1 distanceFromLocation:loc2]];

    return [distance doubleValue];
}
4

2 に答える 2

2

(SQLベースの)Core Dataストアのフェッチ要求では、Objective-Cベースの述語またはソート記述子を使用できません。データベースに保存されている属性でのみフィルタリングできます。

「CoreDataProgrammingGuide」の関連ドキュメントは次のとおりです。

一時プロパティに基づく述語を使用してフェッチすることはできません(ただし、一時プロパティを使用して自分でメモリをフィルタリングすることはできます)。...要約すると、フェッチを直接実行する場合は、通常、Objective-Cベースの述語やソート記述子をフェッチ要求に追加しないでください。代わりに、これらをフェッチの結果に適用する必要があります。

フェッチとストアのタイプの間にはいくつかの相互作用があります。...一方、SQLストアは、述語とソート記述子をSQLにコンパイルし、データベース自体で結果を評価します。これは主にパフォーマンスのために行われますが、評価はCocoa以外の環境で行われるため、Cocoaに依存するソート記述子(または述語)は機能しません。

于 2012-11-08T16:05:43.747 に答える
0

'filterDistanceWithLatitude:'おそらく'filterByDistanceWithLatitude:'

于 2012-11-08T16:04:32.780 に答える