我正在尝试使用SQLite来保存我的应用程序的数据。这个数据库可能有数千条记录,因此在启动时将它们全部加载到一个数组中可能不是一个好主意。所以我通过id在cellForForAtIndexPath中单独加载它们。这有效,但我无法对它们进行排序......任何人都能想到更好的方法吗?我打赌这很简单:L
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"VerbCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
VerbData *verb = [[VerbData alloc] init];
if(isFiltered)
verb = [searchResults objectAtIndex:indexPath.row];
else
{
const char *sql = [[NSString stringWithFormat: @"SELECT infinitive, english FROM verbs WHERE id=%d", indexPath.row+1] UTF8String];
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare_v2(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK){
NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(db));
}else{
while (sqlite3_step(sqlStatement) == SQLITE_ROW) {
verb.infinitive = [NSString stringWithUTF8String:(char *)sqlite3_column_text(sqlStatement,0)];
verb.english = [NSString stringWithUTF8String:(char *)sqlite3_column_text(sqlStatement,1)];
}
}
}
cell.textLabel.text = verb.infinitive;
cell.detailTextLabel.text = verb.english;
return cell;
}
由于(:
答案 0 :(得分:1)
您应该在sql查询中添加“ORDER BY yourField”
答案 1 :(得分:0)
您可以使用偏移和限制
按顺序选择当你使用ORDER BY [ASCENDING |时],Belkadmin是对的DESCENDING]所有排序工作都将由DBMS完成,如果你有远程数据库,这对移动设备有好处,所以服务器端woll会做所有艰苦的工作。您也可以使用
SELECT ... FROM ... ORDER BY ... OFFSET LIMIT
其中: offset - 从数据库的开头偏移 limit - 是查询收集的最大数据行数
然后,您可以将表加载到块中。其他技巧是在表滚动时异步查询行,即加载前100行,但当用户低于第70行时,另一个查询异步进行,并将数据添加到数据源数组