UITableview 的名称部分按排序顺序排列
Posted
技术标签:
【中文标题】UITableview 的名称部分按排序顺序排列【英文标题】:UITableview with sections for Names in sorted order 【发布时间】:2012-01-09 11:27:03 【问题描述】:我知道如何使用 UITableview 委托和数据源协议方法。所以,我可以处理部分。现在我想使用单个查询从数据库中获取所有记录,即从联系人中选择名字,姓氏,按名字 asc 排序。 (现在我使用 26 个单独的查询,我知道这不是正确的解决方案)
现在我想根据部分的字母对联系人进行分组。如果没有以字母 S 开头的联系人。则不应出现 S 部分。你能给我正确的代码或任何教程吗?谢谢
能否请您重新修改此脚本?
-(void)read_data_fromDB objectsForCharacters = [[NSMutableDictionary alloc]init];
sqlite3 *db = [eikardAppDelegate getNewDBConnection];
arr_sectionTitles = [[NSMutableArray alloc] init];
for(char c='A';c<='Z';c++)
NSMutableString *query = nil;
query = [NSMutableString stringWithFormat:@"select first_name, middle_name, last_name from phonebook where first_name like '%c%%';",c];
const char *sql = [query UTF8String];
sqlite3_stmt *selectAllStmt = nil;
if(sqlite3_prepare_v2(db,sql, -1, &selectAllStmt, NULL)!= SQLITE_OK)
NSAssert1(0,@"error preparing statement",sqlite3_errmsg(db));
else
NSMutableArray *arr_persons = [[NSMutableArray alloc] init];
while(sqlite3_step(selectAllStmt)==SQLITE_ROW)
//NSLog(@"Firstname : %@",query);
PersonInfo *person =[[PersonInfo alloc] init];
char *chrstr =(char *)sqlite3_column_text(selectAllStmt, 0);
if(chrstr !=NULL)
person.str_firstName = [NSString stringWithUTF8String:chrstr];
NSLog(@"Firstname : %@",person.str_firstName);
chrstr =(char *)sqlite3_column_text(selectAllStmt, 1);
if(chrstr !=NULL)
person.str_middleName = [NSString stringWithUTF8String:chrstr];
NSLog(@"Middlename : %@",[NSString stringWithUTF8String:chrstr]);
chrstr =(char *)sqlite3_column_text(selectAllStmt, 2);
if(chrstr !=NULL)
person.str_lastName = [NSString stringWithUTF8String:chrstr];
NSLog(@"Lastname : %@",person.str_lastName);
[arr_persons addObject:person];
[person release];
if([arr_persons count]>0)
NSString *keyValue = [NSString stringWithFormat:@"%c",c];
[objectsForCharacters setObject:arr_persons forKey:keyValue];
[arr_sectionTitles addObject:keyValue];
//[arr_persons release];
sqlite3_finalize(selectAllStmt);
sqlite3_close(db);
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [arr_sectionTitles count];
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSString *secTitle = [arr_sectionTitles objectAtIndex:section];
return [[objectsForCharacters objectForKey:secTitle] count];
【问题讨论】:
你试过 NSPredicator 吗? 我不知道如何使用 NSPredicate 和 sqlite 查询。你能给我一个样品吗? 您可以从 sqlite 中检索所有数据,然后在获取数组后,您应该对其执行 NSPredicate。 你在使用核心数据吗? @KAREEMMAHAMMED 你能给我举个例子吗? 【参考方案1】:这取决于数据的来源。如果您使用的是 NSFetchedResultsController,那么您可以使用 initWithFetcRequest:managedObjectContext:sectionNameKeyPath:cacheName: 和 sectionNameKeyPath: 属性的键名。您将多节排序结果。
如果您有来自查询的结果数据(对于整个选择,而不仅仅是 26 个字符中的一个),那么您最好将数据重新排列在有序的数组数组中。也就是说,主数组的每个元素都是索引中每个字母的结果数组。
如果您使用 [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles] 作为部分的标题,则很容易为表实现索引。您不必为每个索引创建一个部分,您将在方法 tableView:sectionForSectionIndexTitle:atIndex: 中为每个索引引用正确的部分:
【讨论】:
以上是关于UITableview 的名称部分按排序顺序排列的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 使用 Realm 和 Swift 具有多个按字母顺序排列的部分,多个标签与相同的数据连接