2010-03-25 4 views
0

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

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

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); 
    } 

В методе таблицы: 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]; 

ответ

0

Это то, что вы хотите, вы стол, чтобы посмотреть, как с точки зрения DataModel:

"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 возвращались в структурированный.

(My SQL ржавый так все ниже SQL является pseudocoded.)

// 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 строк кода плюс графическая модель данных.

+0

Вы действительно технологический дзен! Я не могу поверить, что после этой работы я по-прежнему вытаскивал костяной ход и смешивал HTML/Markup. Сначала я отправился в основной маршрут данных, но обнаружил, что попытка научиться UITableView и основным данным в то же время была намного больше, чем мог справиться мой мозг размером с горошину! Псевдокод SQl не был проблемой. Я делаю это для дневной работы. Еще раз спасибо! –

+0

При необходимости будет оценена галочка. Это также заставляет других более охотно отвечать на ваши вопросы в будущем. – TechZen

+0

Я был почти там, пытаясь реализовать решение сейчас. Вероятно, неважно, но связь между всеми этими массивами была их выборным порядком. Поэтому, если бы я заполнил эти массивы в виде столбцов, из того же оператора выбора, теоретически, на мой взгляд, их размещение индекса определяло бы их строку.Таким образом, все значения для записи 2 в приведенной выше таблице будут содержать размещение objectAtIndex 2 в каждом массиве и всегда удерживать это место каждый раз, когда приложение запускается или viewDidLoad. –

Смежные вопросы