2011-06-04 45 views
1

我正在開發一個iPhone應用程序。我有一個從sqlite數據庫讀取數據並將結果放入數組的函數。一切正常。這裏是一個充滿陣列的部分功能:創建數據庫選擇的通用函數

while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
    NSString *aVar1 = [NSString stringWithUTF8String(char*)sqlite3_column_text(compiledStatement, 0)]; 
    NSString *aVar2 = [NSString stringWithUTF8String(char*)sqlite3_column_text(compiledStatement, 1)]; 

    NSArray *anArray = [NSArray arrayWithObjects:aVar1,aVar2,nil]; 
    [returnArray addObject:anArray] 
    [anArray release]; 
} 
//return the array 

我想使這個功能更加通用的,因此,它需要一個SQL語句字符串作爲參數,並返回數組的mutablearray問題上沒有多少列在結果集中。

有沒有辦法做到這一點?該解決方案不必包含數組 - 可以是任何集合對象。我只是在尋找一種方法來使該功能可以重新用於其他查詢到同一個數據庫。

回答

0

你不能只是這樣做:

int numCols = sqlite3_column_count(compiledStatement); 
NSMutableArray *result = [NSMutableArray array]; 
while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
    NSMutableArray *array = [NSMutableArray array]; 
    for (int i = 0; i < numCols; i++) { 
     [array addObject: 
     [NSString stringWithUTF8String: 
      (char *)sqlite3_column_text(compiledStatement, i)]]; 
    } 
    [result addObject:array]; 
} 
0
+(NSArray *)executeQueryAndReturnArray:(NSString *)query { 
    sqlite3_stmt *statement = nil; 
    const char *sql = [query UTF8String]; 
    if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) != SQLITE_OK) { 
     NSLog(@"[SQLITE] Error when preparing query!"); 
    } else { 
     NSMutableArray *result = [NSMutableArray array]; 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      NSMutableArray *row = [NSMutableArray array]; 
      for (int i = 0; i < sqlite3_column_count(statement); i++) { 
       int colType = sqlite3_column_type(statement, i); 
       id value; 
       if (colType == SQLITE_TEXT) {`enter code here` 
        const unsigned char *col = sqlite3_column_text(statement, i); 
        value = [NSString stringWithFormat:@"%s", col]; 
       } else if (colType == SQLITE_INTEGER) { 
        int col = sqlite3_column_int(statement, i); 
        value = [NSNumber numberWithInt:col]; 
       } else if (colType == SQLITE_FLOAT) { 
        double col = sqlite3_column_double(statement, i); 
        value = [NSNumber numberWithDouble:col]; 
       } else if (colType == SQLITE_NULL) { 
        value = [NSNull null]; 
       } else { 
        NSLog(@"[SQLITE] UNKNOWN DATATYPE"); 
       } 
       [row addObject:value]; 
      } 
      [result addObject:row]; 
     } 
     return result; 
    } 
    return nil; 
}