ios - 从 SQLite 检索行花费太多时间

标签 ios objective-c sqlite

我是 iOS 新手。我正在尝试实现一个 SQLite 数据库。

我的问题是,当我从数据库中获取数据时,即使表中只有 50 条记录,也需要花费很多时间。

我确实做了一个单独的方法来获取数据,因为很多时候我需要为不同的表检索数据。

我的方法:

-(NSArray*)fetch_data:(NSString *)table_name fields_arr:(NSMutableArray *)fields_arr{

    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = dirPaths[0];

    databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent: @"test.db"]];

    const char *dbpath = [databasePath UTF8String];
    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        sqlite3_stmt *SelectStatement;
        NSMutableDictionary *record_dict;

        NSString *SelectQry=@"select ";
        NSString *lastField = [fields_arr lastObject];
        for (int i =0; i<[fields_arr count]; i++) {
            if (fields_arr[i] == lastField) {
                SelectQry = [SelectQry stringByAppendingString:[NSString stringWithFormat:@"%@ ",fields_arr[i]]];
            } else {
                SelectQry = [SelectQry stringByAppendingString:[NSString stringWithFormat:@"%@,",fields_arr[i]]];
            }
        }

        SelectQry = [SelectQry stringByAppendingString:[NSString stringWithFormat:@"from %@",table_name]];


        const char *query_stmt = [SelectQry UTF8String];
        NSMutableArray *resultArray = [[NSMutableArray alloc]init];
        if (sqlite3_prepare_v2(database,
                               query_stmt, -1, &SelectStatement, NULL) == SQLITE_OK)
        {

            while(sqlite3_step(SelectStatement) == SQLITE_ROW)
            {

                record_dict=[[NSMutableDictionary alloc]init];


                for (int i = 0; i<[fields_arr count]; i++) {
                    NSString *field_value = [[NSString alloc]init];
                    field_value = [[NSString alloc] initWithUTF8String:
                                  (const char *) sqlite3_column_text(SelectStatement, i)];
                    [record_dict setValue:field_value forKey:fields_arr[i]];

                }
                [resultArray addObject:record_dict];

            }
            return resultArray;
            //sqlite3_reset(statement);
            sqlite3_finalize(SelectStatement);
        }
        else{
                sqlite3_finalize(SelectStatement);
                return nil;
        }
}

最佳答案

在您的代码中,每次调用获取数据的方法时都会打开数据库连接。这不是适当的方式。您必须只建立一次连接并使用它。

+(sqlite3 *)openDatabase{
if (database == NULL) {
  NSString* str_path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

  NSString *path = [str_path stringByAppendingPathComponent:strDatabaseName];
  if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
    NSLog(@"Database Successfully Opened");
  }
  else {
    NSLog(@"Error in opening database");
    database = NULL;
  }
}
return database;}

您可以在应用程序启动时从应用程序委托(delegate)调用此方法,并在您定义其他数据库方法的类中定义此方法。我希望它会减少一些开销,也会减少一些时间。

关于ios - 从 SQLite 检索行花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28104312/

相关文章:

ios - Ionic App 在应用商店上线 - Socket 现在不工作

objective-c - 如何从异步 NSURLConnection 返回到调用类?

Amazon EC2 上的 MySQL 与 SQLite

java - SQLite 方法总是使我的应用程序在 onClick 上崩溃

iphone - 如何在 iOS 中将 "2012-12-26"之类的日期转换为 "december 26, 2012"?

ios - 两个用 NSIndexPath 填充的通用数组的补充/交集

ios - NSUTF8StringEncoding 给了我这个 %0A%20%20%20%20%22http ://example. com/example.jpg%22%0A

Mac 的 Objective-C 日历组件

objective-c - 适用于 iPhone Retina 4 英寸 64 位的 xcode 5 上的 Dropbox SDK

mysql - 如何使用 sql group by 选择前 2 项并对一个字段求​​和?