2010-08-23 5 views
0

J'essaie de trouver s'il y a un objet dans le tableau mutable qui correspond à l'objet que je passe. S'il vous plaît voir la fonction ci-dessous.Comment utiliser containsObject dans NSMutableArray

Le nom provient du contrôleur de vue de table, ainsi la ligne tapée est enregistrée dans le nom et transmise à cette fonction. J'essaye de vérifier si le nom dans le contrôleur de vue de table est égal au nom venant de la base de données. Ici, le nom fait référence à prénom et nom de famille..C'est la raison pour laquelle j'ajoute ces chaînes.

S'il vous plaît aidez-moi .. Je suis confus de la façon de le faire .. si vous avez une meilleure approche s'il vous plaît laissez-moi savoir .. merci beaucoup .. Je pense qu'il essaie de comparer les emplacements de mémoire de l'objet que cependant), mais est-il possible de sorte qu'il compare exactement le nom que je passe ..

-(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

nom: Blackmon: Valentin

Recherche Nom du contact 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: Valérie, Bouldin: Renaldo, Bracewell: Brendan, Bradford: Kris, Brathwaite: Bill, Brugger: Ismael, Brumit: Julie, Buchholtz: Mathew, Bunker: Chrystal, Burch: Floyd, Burman: Sang, Boucher: prince, Butcher: Rory,

searchContacts Barefield: Collin, Baylis: Efren, Beatty: Peter, Beckwith: Lynn, Benny: Wilma, Bermudes: Lenore, Berryhill: Gérard, Biles: Jodi, Blackmon: Valentin, Blassingame: Rose, Blume: Renae, Bonet: Claude, Bostic: Valérie, Bouldin: Renaldo, Bracewell: Brendan, Bradford: Kris, Brathwaite: Bill, Brugger: Ismael, Brumit: Julie, Buchholtz: Ma thew, Bunker: Chrystal, Burch: Floyd, Burman: Sang, Butcher: Prince, Butcher: Rory,

+0

Avez-vous essayé la connexion 'searchContactName',' 'name' et searchContacts' pour vérifier le code précédent ? –

+0

Merci pour la réponse..Lorsque j'ai essayé d'imprimer le contenu sur la console..le nom que je reçois est correct..Veuillez vérifier les valeurs..J'ai édité le code ci-dessus – racharambola

Répondre

2

Une fois que vous avez toutes vos données dans votre tableau (donc en dehors de cela), vous devez parcourir sur le tableau et utilisez la méthode isEqualToString pour comparer le nom avec l'élément de tableau en cours.

Ok, donc un coup d'oeil sur le code ci-dessous qui fonctionne:

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

Si vous regardez attentivement, vous voyez que moninformateur est « Blackmon: Valentin, » qui a une virgule à la fin. Dans votre tableau, tous vos éléments ont une virgule à la fin. Mais en fonction de ce que vous affichez dans votre message, le nom que vous recherchez, par exemple Nom: Blackmon: Valentin n'a pas de virgule à la fin. C'est peut-être pourquoi vous ne pouvez pas le trouver. Assurez-vous d'ajouter la virgule à la fin et cela devrait fonctionner.

+0

J'ai essayé d'itérer sur les valeurs dans le tableau, mais ce n'est pas entrer dans la boucle même si les valeurs sont égales .. Je ne peux pas comprendre pourquoi :(C'est ce que je fais .. pour (int i = 0; i <[nombre de contacts de recherche]; i ++) { si ([[searchContacts objectAtIndex: i] isEqualToString: nom]) { searchSugarId = [[NSMutableDictionary alloc] initWithObjectsAndKeys: sugar_id, nom, nil]; \t \t \t}} \t \t – racharambola

+0

Je ne sais pas quoi dire autre que: êtes-vous sûr à 100% que les valeurs sont égales? Comme je l'ai dit ci-dessus, j'ai essayé de coder je collé ici dans Xcode et cela a fonctionné pour moi. –

3

containsObject ne retournera qu'un booléen. Vous voulez peut-être indexOfObject: méthode. Une chose que j'ai remarquée dans votre code est que vous ajoutez trop de fois une chaîne dans la même chaîne.par exemple pourquoi ne pas vous utilisez

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

au lieu de

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

Et le plus important: Quand vous faites searchContactName=[searchContactName stringByDoingSomething] assurez-vous searchContactName est libéré, sinon vous serez une fuite de mémoire.

par exemple ici:

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

vous le premier objet une fuite de, alors vous êtes juste faire un nouvel objet (autoreleased) en annexant last_name. Si votre initialisez comme ceci: searchContactName=[searchContactName stringByAppendingString:last_name]; est donc pas nécessaire de faire [[NSString alloc] init];

;) espère que cela aide

+0

merci pour la réponse .. Je vais faire les changements suggérés par vous .. ils étaient très utiles .. j'espère que je vais résoudre mon problème .. – 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

Ceci ne va pas au travail. Vous pouvez comparer deux objets différents et attendre le même résultat. – Kuba

Questions connexes