0

指定された値がエンティティに存在するかどうかを検証する Database クラスにメソッドがあります。この方法を最適化しようとしていることを除いて、すべてが完全に正常に機能しています。このコードをさらに最適化できるかどうか教えていただけますか?

- (NSUInteger)recordAlreadyExists:(NSString*)string forEntity:(NSString*)entityName forKey:(NSString*)key
{
    NSManagedObjectContext *newContext = [Helper generateNewContext];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:newContext];
    [newContext setUndoManager:nil];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    [fetchRequest setEntity:entity];
    [fetchRequest setFetchLimit:1];
        //NSString *predicateString = [NSString stringWithFormat:@"%K LIKE \"%@\"", key, string];//,key,string];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K LIKE %@", key, string];
    [fetchRequest setPredicate:predicate];
    NSError *error;
    NSUInteger resultsCount = [newContext countForFetchRequest:fetchRequest error:&error];

    if(resultsCount)
        return resultsCount;
    return 0;
}

乾杯

4

1 に答える 1

1

2 つの提案があります。

  • "%K == %@"の代わりに、述語が完全に等しいかどうかをテストします"%K LIKE %@"

LIKE単純なワイルドカード ( *, ?) を使用して比較するため、たとえば "J*" を検索するとエントリ "John" も検出されます。これは同等性をテストするよりも遅く、おそらく意図したものではありません。

  • 属性のインデックスを作成します。

一部の属性を非常に高速に検索する必要がある場合は、その属性の Core Data インスペクターで "Indexed" プロパティを設定できます。

注意:は、リクエストの実行中にエラーが発生した場合にcountForFetchRequest:返されるため、その戻り値も確認する必要があることに注意してください。NSNotFound

于 2013-02-26T10:54:15.877 に答える