2012-09-28 23 views
1

我想使用SQLite为我的应用程序保存数据。这个数据库可能有数千条记录,所以在启动时将它们全部加载到数组中可能不是一个好主意。所以我通过id将它们分别加载到cellForForAtIndexPath中。这有效,但我无法排序......任何人都能想出更好的方法吗?我敢打赌,这是非常简单的:LiOS - cellForRowAtIndexPath SQLite排序数据?

- (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

您可以依次选择使用偏移和限制

Row Offset in SQL Server

Belkadmin是正确的,当你使用ORDER BY [ASCENDING | DESCENDING]所有的分拣工作将由DBMS进行,这是很好的移动,如果哟你有远程数据库,所以服务器端工作都很努力。您还可以使用

SELECT ... FROM ... ORDER BY ...抵免限额

其中: 抵消 - 从数据库 限制开始偏移 - 是数据行的最大量聚集通过查询

然后,您可以加载您的表中的块。其他关键是要查询的行异步作为表滚动即加载前100行,但是当用户低于70行另一查询被异步制成,将数据添加到数据源阵列

+0

明白了(谢谢:D –

1

您应该添加 “ORDER BY yourField” 你的SQL查询

+0

但该查询仅选择一个行? :/ –

+0

不要紧,上面的愚蠢评论。我明白了:) –