2013-03-20 2 views
0

мне интересно, если это возможно, чтобы сделать это с NSPredicate:Продвинутый запрос NSPredicate?

NSArray *letters = [[table.Letters componentsSeparatedByString:@","] mutableCopy]; 
NSArray *searched = [[searchString componentsSeparatedByString:@","] mutableCopy]; 
for (int i = 0; i<searched.count-1; i++) 
{ 
    if([letters[i] intValue] == [searched[i] intValue]) 
      //return the record 
    else 
      break; 
} 

В основном то, что я сделал берется каждую строку, разделенных запятыми, и создал массив целых чисел (они всегда будут целыми числами) затем сравнили эти два как целые числа, а не строки, чтобы сделать это намного быстрее.

Есть ли способ сделать это с помощью NSPredicate? или любым способом сделать это с помощью CoreData?

По-видимому, ничто из этого не имеет значения, это мой запрос Fetch.

-(void)titles:(NSString *)toMatch 
{ 
    // THIS IS ALL SETTING UP THE STRING TO BE MATCHED AGAINST THE DATABASE 

    NSMutableArray *retval = [[NSMutableArray alloc] init]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    lineIDArray = [[NSMutableArray alloc] init]; 
    NSString *LabelText =toMatch; 
    NSString *compareString = @""; 
    for (int i = 0; i<LabelText.length; i++) 
    { 
     int letter = [LabelText characterAtIndex:i]; 
     NSString *firstLetters; 
     if(letter<100) 
     { 
      firstLetters = [NSString stringWithFormat:@"0"]; 
      firstLetters = [blah stringByAppendingFormat:@"%d", letter]; 
     } 
     else 
      firstLetters = [NSString stringWithFormat:@"%d", letter]; 
     compareString= [compareString stringByAppendingString:firstLetters]; 
     compareString = [compareString stringByAppendingString:@","]; 
    } 
    //ALL THE WAY UP TO HERE 


    //SETTING UP QUERY 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSPredicate *predicate; 

    //CHECKING WHICH TYPE OF SEARCH THE USER HAS SELECTED, MATCHING THE STRING FROM THE BEGINNING OR SEEING IF WHAT THEY SEARCHED ARE PRESENT IN THE FIRST LETTERS OF THE STRING 
    if ([defaults boolForKey:@"FLS"]) 
     predicate = [NSPredicate predicateWithFormat:@"first_letter_start BEGINSWITH %@", compareString]; 
    else 
     predicate = [NSPredicate predicateWithFormat:@"first_letter_start CONTAINS %@", compareString]; 

    //SETTING UP REQUEST 
    [request setPredicate:predicate]; 
    [request setReturnsObjectsAsFaults:NO]; 
    [request setFetchBatchSize:100]; 
    [request setEntity:entity]; 
    [request setPropertiesToFetch:[NSArray arrayWithObjects:@"gurmukhi", @"shabad_id", nil]]; 
    NSError *error; 

    //FETCHING 
    fetchedObjects = [managedObjectContext executeFetchRequest:request error:&error]; 
    for (Gurbani *shabad in fetchedObjects) 
    { 
     [retval addObject:shabad.gurmukhi]; 
     [lineIDArray addObject:[NSString stringWithFormat:@"%i", shabad.shabad_id]]; 
    } 
    searchResults = retval; 
    [searchResultsTable reloadData]; 
}; 

А вот модель: Anything I'm searching regularly is indexed, including what I'm searching right now.

Вот результат я получаю от использования аргумента -com.apple.CoreData.SQLDebug 1:

2013-03-20 16:53:57.316 GurbaniKhoj[955:907] CoreData: sql: SELECT 0, t0.Z_PK FROM ZSHABAD t0 WHERE NSCoreDataStringSearch(t0.ZFIRST_LETTER_START, ?, 8, 0) 
2013-03-20 16:53:59.982 GurbaniKhoj[955:907] CoreData: annotation: sql connection fetch time: 2.6653s 
2013-03-20 16:53:59.983 GurbaniKhoj[955:907] CoreData: annotation: total fetch execution time: 2.6667s for 92 rows. 
2013-03-20 16:53:59.988 GurbaniKhoj[955:907] CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK, t0.ZGURMUKHI, t0.ZSHABAD_ID FROM ZSHABAD t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) LIMIT 100 
2013-03-20 16:54:00.058 GurbaniKhoj[955:907] CoreData: annotation: sql connection fetch time: 0.0692s 
2013-03-20 16:54:00.059 GurbaniKhoj[955:907] CoreData: annotation: total fetch execution time: 0.0717s for 92 rows. 

Я новенькая на это, так что, возможно, это поможет, Я не уверен, что с этим делать.

+0

Вы убедились, что это на самом деле быстрее? –

+0

@TomHarrington Я честно не уверен, но везде, где я просил, мне почему-то предлагалось использовать целочисленные сравнения, а не сравнение строк. – Mukhi

ответ

0

Вы зря теряете время.

NSDate *date = [NSDate date]; 
    NSArray *letters = [[@",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," componentsSeparatedByString:@","] mutableCopy]; 
    NSArray *searched = [[@",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," componentsSeparatedByString:@","] mutableCopy]; 
    for (int i = 0; i<searched.count-1; i++) 
    { 
    if([letters[i] intValue] == [searched[i] intValue]) 
    { 

    } 
//  NSLog(@"same"); 
    } 

    NSLog(@"ints: %f", [date timeIntervalSinceDate:[NSDate date]]); 

    date = [NSDate date]; 
    for (int i = 0; i<searched.count-1; i++) 
    { 
    if([letters[i] isEqualToString:searched[i]]) 
    { 

    } 
//  NSLog(@"same"); 
    } 
    NSLog(@"strings: %f", [date timeIntervalSinceDate:[NSDate date]]); 

Интс: 0.006064

строки: 0,000979

+0

Это странно, потому что я использую это с coreData, и по какой-то причине Fetch занимает 3-4 секунды всего около 100 строк. Где бы я ни спрашивал, мне сказали, что это из-за сравнения строк? – Mukhi

+0

Это не может занять 3 секунды для сто строк, если вы делаете один запрос на выборку. Снимите код запроса на выборку и соответствующую модель данных в своем исходном сообщении – Eugene

+0

ok, просто добавил. – Mukhi

Смежные вопросы