我正在尝试学习如何将UITableView与SQLite后端结合使用。我的问题是我已经将表格填入数据库中的记录,但是我对章节标题有问题。我无法找到适当的设置,我正在重复每个部分下的所有任务。
表格如下所示。 groups字段是我试图从中获取节标题的地方。
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];
答案 0 :(得分:0)
这是您希望表格从数据模型的角度看起来的样子:
"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生锈了所以下面的所有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
}
这就是创建Core Data的原因。必须将SQL和其他串行表单加入到面向对象API使用的对象图中,这需要大量的粘合代码。使用Core Data,您可以创建一个对象图,然后让后端担心它如何存储到磁盘。
使用Core Data,您可以使用大约8行代码和图形数据模型完成所有这些操作。