Nilesh .S. Joshi
Nilesh .S. Joshi

Reputation: 567

How to filter NSDictonary in UISearchBar?

In my app i am using UITableView To display List of items And UISearchBar to Filter the List Of items. All the data, i am reading it from sqlite3.

Following is my code:

below code is used to retrieve the data from Local DB and save the data into NSMutableDictionary called dict and the the dict is added into NSMutableArray arr_AllTableData.

-(void)dataFromLocalDB

{

const char *dbpath = [databasePath UTF8String];

sqlite3_stmt    *statement;

if (sqlite3_open(dbpath, &PSATestDB) == SQLITE_OK) 

{

NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM Test"];

const char *query_stmt = [querySQL UTF8String];

if (sqlite3_prepare_v2(PSATestDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)

{

while (sqlite3_step(statement) == SQLITE_ROW)

{

companyName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 9)];

[arr_Name addObject:companyName];

address = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 10)];

[arr_Address addObject:address];

number = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 3)];

[arr_TelephoneNo addObject:number];

url = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 4)];

[arr_WebAddress addObject:url];

_dict = [[NSMutableDictionary alloc] init];

[_dict setValue:arr_Name forKey:@"Name"];

[_dict setValue:arr_Address forKey:@"Address"];

[_dict setValue:arr_TelephoneNo forKey:@"Number"];

[_dict setValue:arr_WebAddress forKey:@"WebAddress"];

[arr_AllTableData addObject:_dict];

}

sqlite3_finalize(statement);

sqlite3_close(PSATestDB);

}

}

}

Following code is used to display data in UITableView

#pragma mark - UITableView Data source
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return 1;

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

if (isFiltered == YES)

{

return [filtered_Name count];

}

else

{

return [arr_AllTableData count];

}

}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

NSString *CellIdentifier = @"listCell";

PSAListCell *List = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

if (isFiltered == YES)

{

List.lbl_name.text = [filtered_Name objectAtIndex:indexPath.row];

}

else

{

List.lbl_name.text = [[_dict objectForKey:@"Name"] objectAtIndex:indexPath.row];

List.lbl_address.text = [[_dict objectForKey:@"Address"] objectAtIndex:indexPath.row];

List.lbl_ContactNO.text = [[_dict objectForKey:@"Number"] objectAtIndex:indexPath.row];

List.lbl_WebAddress.text = [[_dict objectForKey:@"WebAddress"] objectAtIndex:indexPath.row];

}

return List;

}

This is my UISearch Bar implemantion code:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

{

if (searchText.length == 0)

{

// set our boolean flag


isFiltered = NO;

}

else

{

//set our boolean flag

isFiltered = YES;



// Alloc And init our filter NSMutable array


filtered_Name = [[NSMutableArray alloc]init];



//fast enumeration





NSMutableArray *test = [[NSMutableArray alloc]init];

for (NSDictionary *dictionary in arr_AllTableData)

{

NSArray *array = [dictionary objectForKey:@"Name"];

[test addObjectsFromArray:array];

}



for (NSString * name in test)

{

 NSRange nameRang = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];

if (nameRang.location != NSNotFound)

{

[filtered_Name addObject:name];


}

}



}


[_ListTable reloadData];

}

I want to filter the NSDictionary which contains the data and want to display to the filter data on UITableView and if the data is not available in the dictionary then it need to call a web service?

Can anyone please help me out with this?

Upvotes: 0

Views: 170

Answers (1)

Vibhu Srivastava
Vibhu Srivastava

Reputation: 146

you can use NSPredicate to filter content from arr_AllTableData based upon your input string.

you can find filter array with predicate in below link. http://alexeckermann.com/blog/legacy/filtering-nsarray-with-nspredicates

Upvotes: 1

Related Questions