在iOS 8.2下,Sqlite3查询变得非常慢

szo*_*lov 5 sqlite ios ios8.2

我已经创建了一个适用于应用程序内的sqlite数据库的应用程序.在iOS 8.2之前,它运行良好,但在更新后,查询方法的工作速度大约慢了100(!!!)倍.我试图找到有关此问题的信息,但我还没有找到任何信息.有人有同样的经历吗?这是我的方法,直到现在才完美.你看到里面有任何错误或优化可能性吗?

谢谢你的帮助!

- (NSArray *)databaseContentWithQueryString:(NSString *)queryString {

NSDate *methodStart = [NSDate date];

NSMutableArray *retArray = [[NSMutableArray alloc] init];

sqlite3_stmt *statement;
if (sqlite3_prepare_v2(_database, [queryString UTF8String], -1, &statement, nil) == SQLITE_OK) {
    while (sqlite3_step(statement) == SQLITE_ROW) {
        int columnCount = sqlite3_column_count(statement);
        NSMutableArray *valueArray = [[NSMutableArray alloc] init];
        NSMutableArray *keyArray = [[NSMutableArray alloc] init];
        for (int i=0; i<columnCount; i++) {
            int type = sqlite3_column_type(statement, i);
            char *name = (char *) sqlite3_column_name(statement, i);
            [keyArray addObject:[NSString stringWithFormat:@"%s",name]];
            int intVal;
            char *charVal;
            if (type == SQLITE_INTEGER) {
                intVal = sqlite3_column_int(statement, i);
                [valueArray addObject:[NSNumber numberWithInt:intVal]];
            }
            if (type == SQLITE_TEXT) {
                charVal = (char *) sqlite3_column_text(statement, i);
                [valueArray addObject:[NSString stringWithUTF8String:charVal]];
            }
            if (type == SQLITE_NULL) {
                intVal = 0;
                [valueArray addObject:[NSNumber numberWithInt:intVal]];
            }
        }
        NSDictionary *dict = [[NSDictionary alloc] initWithObjects:valueArray forKeys:keyArray];
        [retArray addObject:dict];
    }
    sqlite3_finalize(statement);
}

//sqlite3_close(_database);

NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"executionTime = %f s", executionTime);

return retArray;
Run Code Online (Sandbox Code Playgroud)

}

小智 0

看起来你的代码没问题,我刚刚在这里解决了同样的问题,SQLite 框架已更新,并且底层发生了一些变化。调试查询(解释查询计划)我发现我的查询没有使用我的索引...只需确保这一点。