iPhone: повторение строк в каждом разделе сгруппированного UITableview - PullRequest
0 голосов
/ 25 марта 2010

Я пытаюсь узнать, как использовать UITableView в сочетании с серверной частью SQLite. Моя проблема в том, что я получил таблицу для заполнения записями из базы данных, однако у меня возникла проблема с заголовками разделов. Я не могу понять, как это настроить, и я повторяю все задачи в каждом разделе.

Таблица выглядит следующим образом. Поле групп - это то, откуда я пытаюсь вытащить заголовок раздела.

TaskID  groups      TaskName    sched   lastCompleted   nextCompleted   success
1       Household   laundry     3       03/19/2010      03/22/2010      y 
1       Automotive  Change oil  3       03/20/2010      03/23/2010      y 

В моем методе viewDidLoad я создаю массив из каждого столбца в таблице, как показано ниже.

    //Create and initialize arrays from table columns
    //______________________________________________________________________________________

    ids =[[NSMutableArray alloc] init];
    tasks =[[NSMutableArray alloc] init];
    sched =[[NSMutableArray alloc] init];
    lastComplete =[[NSMutableArray alloc] init];
    nextComplete =[[NSMutableArray alloc] init];
    weight =[[NSMutableArray alloc] init];
    success =[[NSMutableArray alloc] init];
    group =[[NSMutableArray alloc] init];



// Bind them to the data
//______________________________________________________________________________________    
    NSString *query = [NSString stringWithFormat:@"SELECT * FROM Tasks ORDER BY nextComplete "];

    sqlite3_stmt *statement;
    if (sqlite3_prepare_v2( database, [query UTF8String],
                           -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            [ids addObject:[NSString stringWithFormat:@"%i",(int*) sqlite3_column_int(statement, 0)]];
            [group addObject:[NSString stringWithFormat:@"%s",(char*) sqlite3_column_text(statement, 1)]];
            [tasks addObject:[NSString stringWithFormat:@"%s",(char*) sqlite3_column_text(statement, 2)]];
            [sched addObject:[NSString stringWithFormat:@"%i",(int*) sqlite3_column_int(statement, 3)]];
            [lastComplete addObject:[NSString stringWithFormat:@"%s",(char*) sqlite3_column_text(statement, 4)]];
            [nextComplete addObject:[NSString stringWithFormat:@"%s",(char*) sqlite3_column_text(statement, 5)]];
            [success addObject:[NSString stringWithFormat:@"%s",(char*) sqlite3_column_text(statement, 6)]];
            [weight addObject:[NSString stringWithFormat:@"%i",(int*) sqlite3_column_int(statement, 7)]];




        }
        sqlite3_finalize(statement);
    }

В методе table: cellForRowAtIndexPath я создаю элементы управления на лету и устанавливаю их свойства текста для объектов в массиве. Ниже приведен пример, я могу предоставить больше, но я уже работаю над книгой здесь ...:)

/create the task label 
NSString *tmpMessage;
tmpMessage = [NSString stringWithFormat:@"%@ every %@ days, for %@ points",[tasks objectAtIndex:indexPath.row],[sched objectAtIndex:indexPath.row],[weight objectAtIndex:indexPath.row]];
    CGRect schedLabelRect = CGRectMake(0, 0, 250, 15);
    UILabel *lblSched = [[UILabel alloc] initWithFrame:schedLabelRect];
    lblSched.textAlignment = UITextAlignmentLeft;
    lblSched.text = tmpMessage;
    lblSched.font = [UIFont boldSystemFontOfSize:10];
    [cell.contentView addSubview: lblSched];
    [lblSched release];

Мой метод numberOfSectionsInTableView выглядит следующим образом

// Figure out how many sections there are by a distinct count of the groups field
// The groups are entered by user when creating tasks   
//______________________________________________________________________________________    
    NSString *groupquery = [NSString stringWithFormat:@"SELECT COUNT(DISTINCT groups) as Sum FROM Tasks"];
    int sum;

    sqlite3_stmt *statement;
    if (sqlite3_prepare_v2( database, [groupquery UTF8String],
                           -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            sum = sqlite3_column_int(statement, 0);

        }
        sqlite3_finalize(statement);
    }
    if (sum=0) {
        return 1;
    }
    return 2;
}

Я знаю, что я ошибаюсь, но это все, что есть в моем методе numberOfRowsInSection

return [ids count];

1 Ответ

0 голосов
/ 29 марта 2010

Вот как вы хотите, чтобы ваш стол выглядел с точки зрения модели данных:

"Household" section
    record 1 of (all records whose "group" column=="Household")
    record 2 of (all records whose "group" column=="Household")
    record 3 of (all records whose "group" column=="Household")
"Automotive" section
    record 1 of (all records whose "group" column=="Automotive")
    record 2 of (all records whose "group" column=="Automotive")
    record 3 of (all records whose "group" column=="Automotive")

Следовательно, ваша модель данных должна отражать эту структуру. Прямо сейчас это не так. Вы просто загружаете каждый столбец в массив, но у вас нет связи между массивами, например, каждый элемент в массиве «group» не имеет отношения к любому элементу в любом другом массиве. Это означает, что у вас нет возможности связать каждую «группу» с другими столбцами в той же записи.

Поскольку в SQL нет структуры, необходимо предоставить объектный слой для преобразования неструктурированных возвратов SQL в структурированный.

(Мой SQL ржавый, поэтому весь приведенный ниже SQL имеет псевдокодирование.)

// for simplicity, assume that the SQL table is indexed and always returns the same order
@property (nonAtomic,retain) NSArray *group;
@sythesize group;

- (void) viewWillAppear:(BOOL)animated{
    // here groups is the column with "Household", "Automotive" etc
    // You want them unique because you want all "Household" under the same section
    NSArray *unSortedgroup=SQL(every unique name in column "group");
    self.group=[unsortedSectionName arraySortedUsing...]; //Sort the array however you wish
}//------------------------------------viewWillAppear:------------------------------------

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [self.group count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return [self.group objectAtIndex:section];  
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSString *sectionName=[self.group objectAtIndex:section];
    NSUInteger *rowCount=SQL(count of all records whose "group" column == sectionName);
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //... setup cell


    NSString *sectionName=[self.group objectAtIndex:section];
    NSArray *rowsForThisSection=SQL(indexs of all records whose "group" column == sectionName);
    // the data for each row cell is now in/pointed to by [rowsForThisSection objectAtIndex:indexPath.row]
    cell.idLabel.text=SQL(column "id" of record whose index is [rowsForThisSection objectAtIndex:indexPath.row])

    // ... and so on for your other columns/attributes      
}

Вот почему были созданы базовые данные. SQL и другие последовательные формы должны быть включены в графы объектов, используемые объектно-ориентированными API, и это требует много кода. С помощью Core Data вы создаете граф объектов, а затем позволяете фоновой программе беспокоиться о том, как он сохраняется на диске.

С помощью Core Data вы можете сделать все это с помощью примерно 8 строк кода плюс графическая модель данных.

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