2010-08-23 2 views
0

Я пытаюсь найти, есть ли какой-либо объект в изменяемом массиве, который совпадает с переданным мной объектом. Пожалуйста, смотрите ниже.Как использовать containsObject в NSMutableArray

Название происходит от контроллера табличного представления, поэтому строка, которая прослушивается, сохраняется в имени и передается этой функции. Я пытаюсь проверить, совпадает ли имя в контроллере представления таблицы с именем, поступающим из базы данных. Здесь имя относится к firstName и lastName. Вот почему я добавляю эти строки.

Пожалуйста, помогите мне .. Я смущен, как это сделать .. Если у вас есть лучший подход, пожалуйста, дайте мне знать .. спасибо много .. Я думаю, что он пытается сравнить места памяти объекта (не уверен, хотя), но есть ли способ, так что он сравнивает именно имя, которое я передаю ..

-(NSMutableDictionary *)getSearchContacts:(NSString *)name 
{ 
//---retrieve rows--- 
NSString *qsql =[[NSString stringWithFormat:@"SELECT * FROM CONTACTS WHERE last_name LIKE '%@",[name substringToIndex:1]]stringByAppendingString:@"%' GROUP BY sugar_id ORDER BY last_name"]; 
NSString *sugar_id; 
NSString *first_name; 
NSString *last_name; 
NSMutableArray *searchContacts=[[NSMutableArray alloc] init]; 

sqlite3_stmt *statement; 
if (searchContactName == nil) { 
    searchContactName=[[NSString alloc]init]; 
} 
if (sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK) { 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
    sugar_id= [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; 
    first_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)]; 
    last_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4)]; 

    if ([first_name isEqualToString:@"(null)"]) { 
    last_name=[last_name stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[last_name substringToIndex:1] uppercaseString]]; 
    searchContactName=[searchContactName stringByAppendingString:last_name]; 
    searchContactName=[searchContactName stringByAppendingString:@":"]; 
    searchContactName=[searchContactName stringByAppendingString:@","]; 

    } 
    else { 

    first_name=[first_name stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[first_name substringToIndex:1] uppercaseString]]; 
    last_name=[last_name stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[last_name substringToIndex:1] uppercaseString]]; 
    searchContactName=[searchContactName stringByAppendingString:last_name]; 
    searchContactName=[searchContactName stringByAppendingString:@":"]; 
    searchContactName=[searchContactName stringByAppendingString:first_name]; 
    searchContactName=[searchContactName stringByAppendingString:@","]; 

    } 
    [searchContacts addObject:searchContactName]; 
    //first_name = nil; 
    //last_name = nil; 
    if ([searchContacts containsObject:name]==YES) { 
       searchSugarId=[[NSMutableDictionary alloc]initWithObjectsAndKeys:sugar_id,searchContactName,nil]; 
    } 

    } 
    //---deletes the compiled statement from memory--- 
    sqlite3_finalize(statement); 
} 
return searchSugarId; 

} 

EDIT

Имя: Blackmon: Валентин

Поиск Контактное лицо Barefield: Collin, Baylis: Efren, Beatty: Peter, Beckwith: Lynn, Benny: Wilma, Bermudes: Lenore, Berryhill: Gerard, Biles: Jodi, Blackmon: Valentin, Blassingame: Rose, Blume: Renae, Бонет: Клод, Бостик: Valerie, Bouldin: Renaldo, Bracewell: Брендан, Брэдфорд: Kris, Brathwaite: Билл, Бруггер: Исмаэль, Brumit: Джули, Buchholtz: Mathew, Бункер: Кристал, Burch: Флойд, Бурман: Санг, Butcher: Принц, Butcher: Рори,

Поиск Контакты Barefield: Collin, Baylis: Efren, Битти: Питер, Беквит Линн, Бенни: Вильма, Бермудес: Ленор, Berryhill: Gerard, желчи: Джоди, Blackmon: Валентин, Blassingame: Роза, Блюм: Рен, Бонет: Клод, Бостики: Valerie, Bouldin: Renaldo, Bracewell: Брендан, Брэдфорд: Kris, Brathwaite: Билл, Бруггер: Исмаэль, Brumit: Джул, Buchholtz: М thew, Bunker: Chrystal, Burch: Floyd, Burman: Sang, Butcher: Prince, Butcher: Rory,

+0

Вы пробовали войти 'searchContactName',' 'name' и searchContacts' проверить предыдущий код ? –

+0

Спасибо за ответ..Когда я попытался распечатать содержимое на консоли .. имя, которое я получаю, правильно. Пожалуйста, проверьте значения. Я отредактировал приведенный выше код. – racharambola

ответ

2

Как только у вас есть все ваши данные внутри вашего массива (поэтому вне времени), вам нужно перебирать массив и используйте метод isEqualToString для сравнения имени с текущим элементом массива.

Итак, посмотрим на код ниже, который работает:

+ (void)testContact { 
NSArray *searchContacts = [NSArray arrayWithObjects: 
                 @"Barefield:Collin,", 
                 @"Baylis:Efren,", 
                 @"Beatty:Peter,", 
                 @"Beckwith:Lynn,", 
                 @"Benny:Wilma,", 
                 @"Bermudes:Lenore,", 
                 @"Berryhill:Gerard,", 
                 @"Biles:Jodi,", 
                 @"Blackmon:Valentin,", 
                 @"Blassingame:Rose,", 
                 @"Blume:Renae,", 
                 @"Bonet:Claude,", 
                 @"Bostic:Valerie,", 
                 @"Bouldin:Renaldo,", 
                 @"Bracewell:Brendan,", 
                 @"Bradford:Kris,", 
                 @"Brathwaite:Bill,", 
                 @"Brugger:Ismael,", 
                 @"Brumit:Julie,", 
                 @"Buchholtz:Mathew,", 
                 @"Bunker:Chrystal,", 
                 @"Burch:Floyd,", 
                 @"Burman:Sang,", 
                 @"Butcher:Prince,", 
                 @"Butcher:Rory,",nil]; 
NSString *myContact = @"Blackmon:Valentin,"; 
for (NSString *contact in searchContacts) { 
    if ([contact isEqualToString:myContact]) { 
     NSLog(@"FOUND!!!!!"); 
     break; 
    } 
} 
} 

Если вы посмотрите внимательно, вы увидите, что myContact является «Blackmon: Валентин,» который имеет запятая в конце. В вашем массиве все ваши элементы имеют запятую в конце. Но на основании того, что вы показываете в своем посте, имя, которое вы ищете, то есть Имя: Блэкмон: у Валентина нет запятой в конце. Возможно, поэтому вы не можете его найти. Убедитесь, что вы добавили запятую в конце, и она должна работать.

+0

Я попытался перебрать значения в массиве, но это не так. входя в цикл, даже если значения равны .. Я не могу понять, почему :(Это то, что я делаю .. для (int i = 0; i <[searchContacts count]; i ++) { if ([[objectAtIndex Поиск Контакты: я] isEqualToString: название]) { searchSugarId = [[NSMutableDictionary Alloc] initWithObjectsAndKeys: sugar_id, имя, ноль]; \t \t \t} \t \t} – racharambola

+0

Не знаю, что сказать, кроме: вы на 100% уверены, что значения равны? Как я уже говорил выше, я попытался закодировать код, вставленный здесь в Xcode, и это сработало для меня. –

3

containsObject будет возвращать только логическое значение. Возможно, вам нужен метод indexOfObject:.

NSInteger index = [array indexForObject:anObject]; 

Одна вещь, которую я заметил в своем коде, что Ваш, добавляя слишком много раз строку в ту же строку.например, почему бы не использовать

searchContactName = [searchContactName stringByAppendingFormat:@"%@:%@,", last_name, first_name]; 

вместо

searchContactName=[searchContactName stringByAppendingString:last_name]; 
    searchContactName=[searchContactName stringByAppendingString:@":"]; 
    searchContactName=[searchContactName stringByAppendingString:first_name]; 
    searchContactName=[searchContactName stringByAppendingString:@","]; 

И более важное: При выполнении searchContactName=[searchContactName stringByDoingSomething] убедитесь searchContactName выпущен в противном случае вам будет утечка памяти.

, например, здесь:

searchContactName=[[NSString alloc]init]; 
... 
searchContactName=[searchContactName stringByAppendingString:last_name]; 

вы протечки первый объект, то вы просто сделать новый (autoreleased) объекта путем добавления last_name. Если ваш инициализируем так: searchContactName=[searchContactName stringByAppendingString:last_name]; тогда не нужно делать [[NSString alloc] init];

;) надеюсь, что это помогает

+0

спасибо за ответ .. Я сделаю внесенные изменения .. они очень помогли .. надеюсь, что я выясню свою проблему. – racharambola

-1
[mutableArry addObject:[NSNumber numberWithInt:questionNumber]]; 
NSLog(@"mutableArry=%@",mutableArry); 
    NSLog(@" question not complete count=%d",mutableArry.count); 

if (mutableArry.count==25) { 
    NSLog(@"25 question complete%d",mutableArry.count); 
} 

NSString *str= [NSString stringWithFormat:@"%d",questionNumber]; 
NSLog(@"str=%@",str); 



// array = [NSArray arrayWithObjects: @"Nicola", @"Margherita",          @"Luciano", @"Silvia", nil]; 
    if ([mutableArry containsObject:str]) // YES 
    { 
     NSLog(@"Results"); 

    } 
+1

Это не сработает. Вы можете сравнить два разных объекта и ожидать того же результата. – Kuba

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