1

我正在尝试使用 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;
}

谢谢(:

4

2 回答 2

1

您应该在 sql 查询中添加“ORDER BY yourField”

于 2012-09-28T23:16:58.237 回答
0

您可以使用偏移量和限制按顺序选择

SQL Server 中的行偏移量

Belkadmin 是对的,当您使用 ORDER BY [ ASCENDING | DESCENDING ] 所有排序工作都将由 DBMS 完成,如果您有远程数据库,这对移动设备非常有用,因此服务器端将完成所有艰苦的工作。你也可以使用

SELECT ... FROM ... ORDER BY ...偏移限制

其中: offset - 与数据库开头的偏移量 limit - 查询收集的最大数据行数

然后,您可以分块加载表格。其他技巧是在表滚动时异步查询行,即加载前 100 行,但是当用户低于第 70 行时,另一个查询是异步进行的,并将数据添加到数据源数组

于 2012-09-28T23:48:39.843 回答