【问题标题】:iPhone SDK: loading UITableView from SQLiteiPhone SDK:从 SQLite 加载 UITableView
【发布时间】:2010-12-05 21:27:02
【问题描述】:

我认为我对 UITableViews 和从/向 SQLite db 获取/插入数据有很好的处理。我在一个架构问题上犹豫不决。

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

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

那么当

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

调用,需要的行从之前加载的 NSMutableArray(或类似结构)中取出。

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

是否应该在每次调用 cellForRowAtIndexPath 时只查询数据库?如果是这样,我将使用什么作为索引?

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

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

谢谢

【问题讨论】:

    标签: iphone objective-c sqlite uitableview


    【解决方案1】:

    我通过将表格单元格需要的内容从我的数据库读取到数据源数组中来解决这个问题,其中包含所有现有的数据库条目。然而,这些对象不会从数组中删除,除非需要删除,否则它们会保留在那里。

    例如,我的一个应用程序读取 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];
    }
    

    【讨论】:

    • 嗨,你能解释一下如何为foreach分配查询(记录集)吗?请详细输入您的代码。谢谢帕斯卡
    【解决方案2】:

    这是我所做的,效果很好(我已经在数据库中测试了 3k 行)。该应用程序是EZBudget

    1. 我只读取数组中的索引,但我对整个表都这样做,不管它有多少行
    2. 在 -(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath in do SELECT on indexPath as index only
    3. 如果需要删除某些行(删除事务),我从数组中删除索引并从表中删除相应行
    4. 在表中添加记录时,我得到 SQLite 返回新添加记录的自动递增索引。我把这个索引添加到索引数组中

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

    感谢大家的建议!

    【讨论】:

      【解决方案3】:

      您始终可以执行一个 select 语句以按您想要的顺序仅获取“自动增量索引”,并将它们保存在一个数组中(您将拥有一个包含数千个整数的数组,应该没问题)。然后,在“cellForRowAtIndexPath”中,从您的数组中获取正确的“自动增量索引”并获取您需要的所有数据(我在下面调用“id”您的“自动增量索引”......)。

      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 的调用等等,您甚至可以使用int[](而不是NSArray*)...您可以使用'@ 的结果分配int[] 987654326@'

      【讨论】:

        猜你喜欢
        • 2010-12-06
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        相关资源
        最近更新 更多