簡體   English   中英

從iOS中的選擇查詢填充數組

[英]Populating array from select query in iOS

所以我對iOS開發相當新,我的select函數出現問題。 我創建了一個函數,它應該接受一個select查詢和表名並返回一個結果數組,其中每個數組條目都是一個帶有一行結果的字典。 不知怎的,我對列名的查詢是刪除我的columnNames變量並返回瘋狂的結果。 我只是想找出一種存儲,訪問,操作查詢結果的簡單方法

這是將結果轉換為數組的函數:

-(NSMutableArray *)selectQuery:(NSString*)query
                     table:(NSString*)table
{
NSMutableArray *returnArray = [NSMutableArray new];

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
    NSMutableArray *columnNames;
    NSString *tableQuery = [NSString stringWithFormat:@"PRAGMA table_info('%@')", table];

    if (sqlite3_prepare_v2(database, [tableQuery UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            [columnNames addObject:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 1)]];
        }
    }
    else
    {
        NSLog(@"Error preparing table query:");
        NSLog(tableQuery);
    }

    if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        while(sqlite3_step(statement)==SQLITE_ROW)
        {
            NSMutableDictionary *temp= [NSMutableDictionary new];

            for (int i = 0; i < [columnNames count]; i++)
            {
                [temp setObject:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, i)] forKey:columnNames[i]];
            }

            if (temp != nil)
            {
                [returnArray addObject:temp];

                temp = nil;
            }
        }
        sqlite3_reset(statement);
        sqlite3_close(database);
    }
    else
    {
        NSLog(@"Error preparing select statement with query:");
        NSLog(query);
    }
}
else
{
    NSLog(@"Could not open database");
}
return returnArray;
}

並且繼續呼吁它

NSMutableArray *queryResults = [dbInstance selectQuery:[NSString stringWithFormat:@"SELECT gallons, mileage FROM fillups WHERE carId = \"%d\" ORDER BY date asc",
                                                   carId]
                                            table:@"fillups"];

您永遠不會實例化columnNames 因此,您嘗試將列名添加到該數組將不會成功。 為了解決這個問題,當你聲明它時,你也希望實例化可變數組對象:

NSMutableArray *columnNames = [NSMutableArray array];

與此問題無關,當您完成檢索列名稱時,在准備第二個語句之前,請不要忘記釋放與第一個預准備語句關聯的內存:

sqlite3_finalize(statement);

最后,當您完成檢索第二個准備好的SQL語句,而不是調用sqlite3_reset ,您希望再次為第二個sqlite3_finalize准備語句調用sqlite3_finalize 當您想要將新值綁定到時, sqlite3_reset用於重置語句? 語句中的占位符在此處不適用,因此不需要sqlite3_reset 但是,如果不調用sqlite3_finalize ,則不會釋放與sqlite3_finalize准備語句關聯的內存。


順便說一下,如果你想動態檢索列名和列類型(不必做PRAGMA table_info ),你可以這樣做:

int rc;

if ((rc = sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL)) != SQLITE_OK) {
    NSLog(@"select failed %d: %s", rc, sqlite3_errmsg(database));
}

NSMutableArray *returnArray = [NSMutableArray array];
NSInteger columnCount = sqlite3_column_count(statement);

id value;

while ((rc = sqlite3_step(statement)) == SQLITE_ROW) {
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

    for (NSInteger i = 0; i < columnCount; i++) {
        NSString *columnName   = [NSString stringWithUTF8String:sqlite3_column_name(statement, i)];
        switch (sqlite3_column_type(statement, i)) {
            case SQLITE_NULL:
                value = [NSNull null];
                break;
            case SQLITE_TEXT:
                value = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(statement, i)];
                break;
            case SQLITE_INTEGER:
                value = @(sqlite3_column_int64(statement, i));
                break;
            case SQLITE_FLOAT:
                value = @(sqlite3_column_double(statement, i));
                break;
            case SQLITE_BLOB:
            {
                NSInteger length  = sqlite3_column_bytes(statement, i);
                const void *bytes = sqlite3_column_blob(statement, i);
                value = [NSData dataWithBytes:bytes length:length];
                break;
            }
            default:
                NSLog(@"unknown column type");
                value = [NSNull null];
                break;
        }
        dictionary[columnName] = value;
    }

    [returnArray addObject:dictionary];
}

if (rc != SQLITE_DONE) {
    NSLog(@"error returning results %d %s", rc, sqlite3_errmsg(database));
}

sqlite3_finalize(statement);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM