花费太多时间从SQLite中检索行

时间:2015-01-23 06:37:00

标签: 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;
        }
}

1 个答案:

答案 0 :(得分:1)

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

+(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;}

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