UITableview с разделами для имен в отсортированном порядке - PullRequest
1 голос
/ 09 января 2012

Я знаю, как работать с делегатами UITableview и методами протокола источника данных. Итак, я могу работать с разделами. Теперь я хотел бы использовать один запрос для извлечения всех записей из базы данных, т. Е. Выбрать имя, фамилию в порядке контактов по имени asc. (Сейчас я использую 26 отдельных запросов, я знаю, что это неправильное решение)

Теперь я бы хотел сгруппировать контакты по алфавиту по разделам. Если никакие контакты не начинаются с буквы S. Тогда раздел для S не должен появляться. Можете ли вы предоставить мне правильный код или любой учебник? Спасибо

Можете ли вы повторить этот сценарий?

- (Недействительными) 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];
}

1 Ответ

1 голос
/ 09 января 2012

Зависит от происхождения данных.Если вы используете NSFetchedResultsController, то вы можете использовать initWithFetcRequest: managedObjectContext: sectionNameKeyPath: cacheName: с именем ключа свойства для sectionNameKeyPath :.Упорядоченные результаты будут разбиты на несколько частей.

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

Если вы используете [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles] в качестве заголовков для разделов, легко реализовать индекс дляТаблица.Вам не нужно создавать раздел для каждого индекса, вы будете ссылаться на правильный раздел для каждого индекса в методе tableView: sectionForSectionIndexTitle: atIndex:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...