Какой лучший способ создать эту строку? (NSMutableString ...) - PullRequest
3 голосов
/ 03 июня 2011

У меня есть словарь, ключи которого - NSStrings, а объекты - NSArray. Вот пример:

key (NSString) : GroupA 
value (NSArray): John
                 Alex
                 Joe
                 Bob

Есть много таких записей, это только пример. Что мне нужно сделать, это сгенерировать строку вроде этой (например:

(GroupA contains[cd] ('John' OR 'Alex' OR 'Joe' OR 'Bob')) AND (GroupB contains[cd] ('Starcraft' OR 'WOW' OR 'Warcraft' OR 'Diablo')) AND ..... 

Я собираюсь передать эту строку в NSP-предикат. Какой лучший способ создать эту строку? Я могу использовать для циклов, и если и все такое, но есть ли гораздо более элегантный способ? Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

Это недопустимая строка формата предиката, поэтому даже если вы в конечном итоге сгенерируете ее, вы не сможете преобразовать ее в NSPredicate

Вот что вы хотите вместо этого:

NSDictionary *groupValuePairs = ....;

NSMutableArray *subpredicates = [NSMutableArray array];
for (NSString *group in groupValuePairs) {
  NSArray *values = [groupValuePairs objectForKey:group];
  NSPredicate *p = [NSPredicate predicateWithFormat:@"%K IN %@", group, values];
  [subpredicates addObject:p];
}

NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];

Это не имеет нечувствительности к регистру и диакритике, на которую намекал ваш оригинал.Если вам это действительно нужно, то вам нужно будет немного сложнее:

NSDictionary *groupValuePairs = ....;

NSMutableArray *subpredicates = [NSMutableArray array];
for (NSString *group in groupValuePairs) {
  NSArray *values = [groupValuePairs objectForKey:group];
  NSMutableArray *groupSubpredicates = [NSMutableArray array];
  for (NSString *value in values) {
      NSPredicate *p = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", group, value];
      [groupSubpredicates addObject:p];
  }
  NSPredicate *p = [NSCompoundPredicate orPredicateWithSubpredicates:groupSubpredicates];
  [subpredicates addObject:p];
}

NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];
1 голос
/ 03 июня 2011

Это должно быть примерно так

NSDictionary *myDict = [NSDictionary dictionaryWithObject:[NSArray arrayWithObjects:@"John",@"Alex",@"Joe",@"Bob",nil] forKey:@"GroupA"];
NSString *myString = @"(";

int j = 0;
for(NSString *key in [myDict allKeys]) {
    NSString *value = [myDict valueForKey:key];
    myString = [myString stringByAppendingFormat:@"%@ contains[cd] (", key];
    NSArray *myArray = (NSArray *)value;

    int idx = 0;
    for(NSString *name in myArray) {
        myString = [myString stringByAppendingFormat:@"'%@'",name];
        if(idx < [myArray count] - 1) {
            myString = [myString stringByAppendingFormat:@" OR "];
        } 
        idx++;
    }

    myString = [myString stringByAppendingString:@")"];

    if(j < [myDict count] -1) {
        myString = [myString stringByAppendingString:@" AND "];
    }

    j++;

};

myString = [myString stringByAppendingString:@")"];

NSLog(@"mystring %@",myString);
...