2009-10-12 103 views
1

我想我在UITableViews和从SQLite数据库获取/插入数据方面得到了很好的处理。我正在讨论一个建筑问题。iPhone SDK:从SQLite加载UITableView

我的应用程序在数据库中保存了3个值,可以有多/多行。但是,我会加载他们在表中?

从我所见过的所有教程中,通过执行SELECT语句将整个数据库加载到NSMutableArray或类似对象中。

然后当

- (的UITableViewCell *)的tableView:(UITableView的*)的tableView的cellForRowAtIndexPath:(NSIndexPath *)indexPath

调用,所需的行从前面的打扮出装载的NSMutableArray(或类似的意象结构) 。

但是我有几千行?为什么要预加载它们?

我应该每次调用cellForRowAtIndexPath时都要查询数据库吗?如果是这样,我会用什么作为索引?

表中的每一行都会有一个AUTOINCREMENT索引,但由于某些行可能会被删除,索引将不会对应表中的行(在SQL中,我可能有这样的行,索引3丢失):

1数据1数据1 2数据2数据2 4.数据3数据3

感谢

回答

3
结果分配你的 int[]

我通过读取表格单元格需要从我的数据库到数据源数组中的所有现有数据库条目来解决此问题。这些对象不会从数组中移除,但它们会停留在那里,除非它们需要被移除。

例如,我的一个应用程序读取1'700行,每行创建一个对象,分配一个NSUInteger(自动增量值)和一个NSString(将在单元格中显示的对象的名称)和将它们放入数据源数组中。这整个过程只需要大约200-300毫秒 - 你必须测试10'000 +条目是否需要太长的时间,但对于数千条条目,只读全部应该是可以的。我记得内存消耗也很低,不能准确查找ATM有多少。然后,当用户点击一行时,我查询数据源数组以查找他刚刚点击的对象,然后此对象从数据库加载所有其他值,因为它知道它自己的数据库密钥/ id(它“保湿”本身)。

对于(使用FMDB)完整性的考虑:

NSResultSet *res = [db executeQuery:@"SELECT my_key, my_name FROM table"]; 
while ([res next]) { 
    NSDictionary *dict = [res resultDict]; 
    MyObj *obj = [MyObj obj]; 
    obj.id = [dict objectForKey:@"my_key"]; 
    obj.name = [dict objectForKey:@"my_name"]; 

    [datasourceArray addObject:obj]; 
} 
+0

嗨,你能解释我如何为foreach分配查询(记录集)吗?请详细说明你的代码。谢谢Pascal – dinesh 2012-01-23 10:53:14

+0

dinesh,我更新了代码,希望这有助于。 – Pascal 2012-01-23 16:06:01

+0

非常感谢,让我试试 – dinesh 2012-01-24 08:22:36

1

你总是可以做一个选择语句在你希望的顺序来获取只是“自动增量指标”,并让他们在一个数组(你将有一个数组,数以千计的整数,寿没关系)。然后,在'cellForRowAtIndexPath'中,从你的数组中获取正确的'autoincrement index'并获取你需要的所有数据(我在下面调用'id'你的'autoincrement index'...)。

NSArray *ids; // Put the result of 'select id from datatable' here 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Fetch full row where autoincrement index is: [ids objectAtIndex:indexPath.row] 

当然,如果你想在调用保存到intValue和这样的你甚至可以使用(而不是NSArray*)一int[] ...您可以使用“select count(*) from datatable

2

这里是我做的,它完美地工作(我有3K排在DB测试)。该应用程序是EZBudget

  1. 我只读索引到数组,但我对整个表这样做,但是许多行有
  2. 在 - (UITableViewCell的*)的tableView:(UITableView的*)的tableView的cellForRowAtIndexPath: (NSIndexPath *)indexPath在indexPath上做SELECT仅作为索引
  3. 如果某些行需要删除(一个事务被删除)我删除数组中的索引并从表中删除相应的行
  4. 当记录是在表中添加,我得到SQLite返回新增记录的自动增量索引。我把这个索引,并添加到索引数组

所以我的索引数组始终与整个表同步。在任何时候,我都可以通过数组中的索引选择整个记录。

谢谢大家的建议!