2016-07-25 9 views
0

私はUserとMobileの2つのエンティティを持っています。ユーザーには、モバイルとの関係名の番号があります。ここ は私のコードNSPredicateでのリレーションシップの問い合わせ

+(void)getUserPhoneNumber:(NSString*)searchString{ 
NSLog(@"search string is %@",searchString); // e.g. 8 
NSManagedObjectContext *context = [[DataManager sharedManager]managedObjectContext]; 
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:NSStringFromClass([User class])]; 
NSError *error = nil; 
NSArray *array = [context executeFetchRequest:request error:&error]; 
for (User * objUser in array) { 
    NSArray *arrayNumber = [(NSSet *)[objUser.numbers valueForKey:@"number"]allObjects]; 
    NSLog(@"%@",arrayNumber); 
    // NSPredicate *predicate=[NSPredicate predicateWithFormat:@"SELF == %@",searchString]; 
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"SELF == %@",searchString]; 
    NSArray *filtered = [arrayNumber filteredArrayUsingPredicate:predicate]; 
    if (filtered.count>0) { 
     NSLog(@"SEARCHED MOBILE NUMBER USER NAME ----> %@",objUser.fullname); 
     NSLog(@"SEARCH PHONE NUMBER IS----> %@",[[filtered objectAtIndex:0] valueForKey:@"number"]); 
     return; 
    } 
} 
} 

である私は、例えばテキストフィールドに入力中の数字を取得したいです8。それは名前と携帯番号で返されます。 ユーザーは属性名firstnameを持っています。

答えて

0

まず、ユーザーの電話番号のみを含む配列のNSSetを作成します。この配列を使用すると、検索文字列に一致する名前の番号をフィルタリングできません。

名前または電話番号に含まれる検索文字列に基づいて連絡先を検索する場合、次の述語を要求した配列に適用できます。

NSArray * filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ContactName contains[c] %@ OR number contains[cd] %@",searchText,searchText]]; 

ここで、ContactNameはcontactNameのフィールド名で、numberは電話番号フィールドのフィールド名です。 filteredは最終結果配列です。

またはこの述語をNSFetchRequestリクエストに適用すると、配列をフィルタリングする1つのステップが減算されます。これにより、直接フィルタリングされた配列が得られます。

これはあなたに役立つと思います。