0

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;
}

基本的に私が行ったことは、コンマで区切られた各文字列を取得し、整数の配列を作成し(常に整数になります)、2つを文字列ではなく整数として比較して、はるかに高速にします。

これを行う方法はあります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];
};

モデルは次のとおりです。 現在検索しているものも含め、定期的に検索しているものはすべてインデックスに登録されています。

引数を使用して得られる出力は次の-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.

私はこれが初めてなので、これが役立つかもしれませんが、これをどうすればよいかわかりません。

4

1 に答える 1

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

于 2013-03-20T17:50:28.637 に答える