2011-11-28 52 views
0

好吧,出於某種原因,我得到一個愚蠢的錯誤。將值附加到我的NSMutableArray

-(void) getAllRowsFromTableNamed: (NSString *) tableName { 

    NSString *qsql = @"SELECT supplier from products"; 
    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, nil) == 
     SQLITE_OK) { 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      char *field1 = (char *) sqlite3_column_text(statement,0); 
      NSMutableString *field1Str = [[NSMutableString alloc] initWithUTF8String: field1]; 
      listofsuppliers = [NSMutableArray arrayWithObjects:field1Str, nil]; 
      NSLog(@"list of suppliers %@",listofsuppliers); 
      [field1Str release]; 
     } 
     sqlite3_finalize(statement); 
    } 
} 

在我的記錄,我發現了以下內容:

QueensWayInventory[13192:f803] list of suppliers ("(null)") 
QueensWayInventory[13192:f803] list of suppliers ("(null)") 
QueensWayInventory[13192:f803] list of suppliers (Dell) 
QueensWayInventory[13192:f803] list of suppliers (Apple) 
QueensWayInventory[13192:f803] list of suppliers (Apple) 
QueensWayInventory[13192:f803] list of suppliers (Dell) 

我想這個代替:

QueensWayInventory[13192:f803] list of suppliers (
    Dell, 
    Apple 
) 

它必須是很簡單的東西,我做錯了。當我創建一個靜態列表時,我知道它是如何實現的,但是當我試圖從數據庫創建一個動態讀取時,卻沒有。

回答

1
  1. 您需要創建NSMutableArray while循環。您在while循環的每次迭代中重新創建它,並且當您將其打印到控制檯時,它總是隻有一個值。使用-appendObject:在循環內添加每個後續字符串值。

  2. 雖然沒有什麼關於與FIELD1 UTF8字符串創建NSMutableString來,然後添加到您的陣列的關鍵,它通常更好的做法是創建一個非可變NSString。如果您計劃操縱該字符串的內容,請使用NSMutableString

3

這條線:

listofsuppliers = [NSMutableArray arrayWithObjects:field1Str, nil]; 

是你的問題。

它丟棄舊的數組,並創建一個具有單個元素的新數組。

相反,你的循環之前,你想:

listofsuppliers = [[NSMutableSet alloc] init]; 

我已經使用了集而不是數組的,因爲你只想包括每個元素的一個副本。

然後你的循環中:

[listofsuppliers addObject:field1Str]; 

另外請注意,有沒有真正的需要在這裏創建一個可變的字符串。

+0

好的非常感謝,我得到了它使用nsmutablearray。問題如你所示。我絕對不得不把它放在循環之外,它工作。非常感謝(Y) – user984373