2012-03-22 6 views
6

これは文字どおり私をナットにしています。iOSコアデータ述語を使用して文字列テキストを適切に比較する方法は?

私はユニークな属性としてNSStringsを使用する2つのエンティティを持っています。

NSStringを比較する述部を作成する正しい方法は何ですか?

現在、私は持っています: [NSPredicate predicateWithFormat:@ "unique =%@"、uniqueValue];

これは実際の文字列値ではなくポインタアドレスを比較しているような気がしますが、確認できません。私は正確な文字列の一致のためにはいを返す必要があります。

-(BOOL)uniqueEntityExistsWithEnityName:(NSString*)entityName UniqueKey:(NSString*) uniqueKey UniqueValue:(NSString*)uniqueValue SortAttribute:(NSString*)sortDescriptorAttribute ManagedObjectContext:(NSManagedObjectContext*) context; 
{ 
    BOOL returnValue = NO; 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; 

//what is the correct predates to compare the text an string core data property against a passed in string? 
    request.predicate = [NSPredicate predicateWithFormat:@"unique= %@", uniqueValue]; 

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:sortDescriptorAttribute ascending:YES]; 
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    NSError *error = nil; 
    NSArray *matches = [context executeFetchRequest:request error:&error]; 
    if (!matches) 
    { 
     NSLog(@"Error: no object matches"); 
    } 
    else if([matches count] > 1) { 
     NSLog(@"Error: More than one object for unique record"); 
     returnValue = YES; 

    } else if ([matches count] == 0) { 
     returnValue = NO; 
    } else { 
     returnValue = YES; 
    } 

    return returnValue; 
} 
+0

あなたには気分や実際の問題がありますか?あなたのコードは大丈夫です。データはsqliteデータベースからフェッチされますが、ポインタアドレスとどのように一致する必要がありますか? –

答えて

9

単一の等号は、コーディングの点でコンパレータでさえありません。

私はNSManagedObject属性であると仮定します。

[NSPredicate predicateWithFormat:@"unique LIKE %@", uniqueValue]; 

大文字と小文字が区別されることに注意してください。それを区別しないようにするには、LIKEの後ろに[c]を置くことができます。

+0

ありがとうKevin、私はそれを試してみよう! –

+12

単一の等号は、NSPredicateで使用するのに最適です。 –

+0

ああ!あなたが正しいと思います!うわー、それは奇妙に思えます(単一の等号を符号化する他のすべての場所が割り当てであることを考えれば)。 –

7

あなたの述語に問題はありません。正確な文字列に一致させたい場合は、=という単一の文字が最適です。ワイルドカードマッチングが必要ない場合は、より遅いLIKEは必要ありません。 (Predicate Format String Syntax

ただし、コードに問題があり、正しくないと思われることがあります。 if/then/else、または少なくとも最初のメッセージは間違っています。フェッチすると配列が返されない場合、フェッチが失敗したことを意味しますが、フェッチがオブジェクトを返さなかったことを意味しません。

それはもっとこのようにする必要があります:

if (!matches) 
{ 
    NSLog(@"Error: couldn't execute fetch request %@", error); 
} 
else if([matches count] > 1) { 
    NSLog(@"Error: More than one object for unique record"); 
    returnValue = YES; 
} else if ([matches count] == 0) { 
    NSLog(@"couldn't match objects"); 
    returnValue = NO; 
} else { 
    // [matches count] == 1 
    NSLog(@"matched one object"); 
    returnValue = YES; 
} 

ああ、私は条件の順序を変更します。私の意見では、(!matches)(([matches count] == 1)、([matches count] == 0)、(else)のような構造体はもっと意味があり、読みやすくなります。あなたは最後の "匿名"の中で最も重要なものを(あなたが実際に望むものなので)置く。

関連する問題