【问题标题】:Need To Optimize SQLite Loading Into TableView需要优化 SQLite 加载到 TableView 中
【发布时间】:2011-10-22 05:30:13
【问题描述】:

我有一个包含 5000 行的 SQLite 数据库,该数据库已加载到 tableview 中。

加载表格大约需要 5-10 秒(这在 iPhone 上非常长)。有没有办法可以分批加载单元格或其他方法来加快速度?此外,当我返回层次结构然后重新访问此视图时,它必须重新重新加载。我可以把它缓存出来吗?

- (void)viewDidLoad
{
    [super viewDidLoad];
    [NSThread detachNewThreadSelector:@selector(myThread:) toTarget:self withObject:nil]; 
}

-(void) myThread:(id) obj {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSMutableArray *array = [[Database sharedDatabase] getICD9DiseaseCodes];

    [self performSelectorOnMainThread:@selector(dataDoneLoading:) withObject:array waitUntilDone:NO];
    [pool release];    
}

-(void) dataDoneLoading:(id) obj {
    NSMutableArray *array = (NSMutableArray *) obj;
    self.codeAray = array;
    [self.myTableView reloadData];
    [self dismissHUD];
    NSLog(@"done");    
}

在我的数据库类中:

-(NSMutableArray *) getICD9DiseaseCodes
{
    sqlite3 *database = CodesDatabase();

    NSMutableArray *icd9DiseaseCodes = [[[NSMutableArray alloc] init] autorelease];

    NSString *nsquery = [[NSString alloc] initWithFormat:@"SELECT code, title, description FROM icd9_disease_codes ORDER BY code"];
    const char *query = [nsquery UTF8String];
    [nsquery release];

    sqlite3_stmt *statement;
    int prepareCode = (sqlite3_prepare_v2( database, query, -1, &statement, NULL));
    if(prepareCode == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            ICD9DiseaseCodes *code = [[ICD9DiseaseCodes alloc] init];
            code.code = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 0) encoding:NSUTF8StringEncoding];
            code.name = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding];
            code.description = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 2) encoding:NSUTF8StringEncoding];
            [icd9DiseaseCodes addObject:code];
            //            NSLog(@"Code: %@ Short Description: %@ Long Description: %@", hcpcsCode.code, hcpcsCode.name, hcpcsCode.description);
            [code release];
        }
        sqlite3_finalize(statement);
    }
    return icd9DiseaseCodes;
}

【问题讨论】:

    标签: iphone objective-c xcode sqlite uitableview


    【解决方案1】:

    我的第一个问题是为什么你直接使用 SQLite,而不是 Core Data? Core Data 将免费为您从数据存储中快速提取部分数据,无需您额外编写代码。

    如果您想直接使用 SQLite 手动执行相同的操作,那么您需要一些繁重的代码。您需要在 SQL 查询中使用 LIMITOFFSET 来获取部分数据,并扩展您的 API 以一次仅获取较小的子集。

    【讨论】:

    • 我希望我可以使用 Core Data,但我已经制作了 SQLite 数据库,但无法将其加载到核心数据中。
    • @Faisal - 它是出于某种原因必须使用的数据库吗?使用 Xcode 中的拖放 UI 再次执行 Core Data 模型可能比继续使用手动 SQLite 更快。特别是如果你想解决这个性能问题。
    【解决方案2】:

    您是否考虑或研究过 CoreData? CoreData 对大型记录集进行了大量优化。

    谢谢。 詹姆斯

    【讨论】:

    • 我希望我可以使用 Core Data,但我已经制作了 SQLite 数据库,但无法将其加载到核心数据中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2014-02-15
    • 2021-04-01
    相关资源
    最近更新 更多