Iphone UITableview,带有按排序顺序排列的名称部分

Iphone UITableview,带有按排序顺序排列的名称部分,iphone,ios,xcode,uitableview,Iphone,Ios,Xcode,Uitableview,我知道如何使用UITableview委托和数据源协议方法。所以,我可以使用分区。现在我想使用一个查询从数据库中获取所有记录,即选择firstname,lastname from contacts order by firstname asc。(现在我使用26个人查询,我知道这不是正确的解决方案) 现在,我想根据联系人的字母表对其进行分组。如果没有以字母S开头的联系人,则不应出现S部分。你能给我提供正确的代码或任何教程吗?谢谢 你能修改一下这个脚本吗 -(无效)从数据库中读取数据 { object

我知道如何使用UITableview委托和数据源协议方法。所以,我可以使用分区。现在我想使用一个查询从数据库中获取所有记录,即选择firstname,lastname from contacts order by firstname asc。(现在我使用26个人查询,我知道这不是正确的解决方案)

现在,我想根据联系人的字母表对其进行分组。如果没有以字母S开头的联系人,则不应出现S部分。你能给我提供正确的代码或任何教程吗?谢谢

你能修改一下这个脚本吗

-(无效)从数据库中读取数据 { 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];
}
sqlite3*db=[eikardAppDelegate getNewDBConnection];
arr_sectionTitles=[[NSMutableArray alloc]init];
for(char c='A';c0)
{
NSString*keyValue=[NSString stringWithFormat:@“%c”,c];
[objectsForCharacters setObject:arr_persons-forKey:keyValue];
[arr_sectionTitles addObject:keyValue];
}
//[arr_人员释放];
}
sqlite3\u完成(选择所有stmt);
}
sqlite3_close(db);}
-(NSInteger)表格视图中的节数:(UITableView*)表格视图
{
返回[arr_计数];
}
//自定义表视图中的行数。
-(NSInteger)表视图:(UITableView*)表视图行数节:(NSInteger)节
{
NSString*secTitle=[arr_sectionTitles objectAtIndex:section];
返回[[objectsForCharacters objectForKey:secTitle]计数];
}

这取决于数据的来源。如果您使用的是NSFetchedResultsController,则可以将initWithFetcRequest:managedObjectContext:sectionNameKeyPath:cacheName:与sectionNameKeyPath:属性的键名一起使用。您将看到多节有序结果

如果查询的结果数据(对于整个选择,而不仅仅是26个字符中的一个)位于一个数组中,那么最好在一个有序数组中重新排列数据。也就是说,主数组的每个元素都是索引中每个字母的结果数组


如果使用[[UILocalizedIndexedCollation currentCollation]sectionIndexTitles]作为节的标题,则很容易实现表的索引。您不必为每个索引创建节,您将在方法tableView:sectionForSectionIndexTitle:atIndex:

中为每个索引引用正确的节,这取决于数据的来源。如果您使用的是NSFetchedResultsController,则可以将initWithFetcRequest:managedObjectContext:sectionNameKeyPath:cacheName:与sectionNameKeyPath:属性的键名一起使用。您将看到多节有序结果

如果查询的结果数据(对于整个选择,而不仅仅是26个字符中的一个)位于一个数组中,那么最好在一个有序数组中重新排列数据。也就是说,主数组的每个元素都是索引中每个字母的结果数组


如果使用[[UILocalizedIndexedCollation currentCollation]sectionIndexTitles]作为节的标题,则很容易实现表的索引。您不必为每个索引创建节,您将在tableView:sectionForSectionIndexTitle:atIndex:

方法中为每个索引引用正确的节您是否尝试过NSPredicator?我不知道如何将NSPredicate与sqlite查询一起使用。你能给我一个例子吗?你可以从sqlite中检索所有数据,然后在获得数组后,你应该对其执行NSPredicate。你在使用核心数据吗?@KAREEMMAHAMMED你能给我举个例子吗?你试过NSPredicator吗?我不知道如何将NSPredicate与sqlite查询一起使用。你能给我一个样本吗?你可以从sqlite检索所有数据,然后在得到一个数组后,你应该对其执行NSPredicate。你在使用核心数据吗?@KAREEMMAHAMMED你能给我一个例子吗?