2011-09-28 72 views
1

以下方法代碼是FOR循環,它從SQLite數據庫構建26個數組(每個字母表一個字母)。有關For循環和數組的問題

問題是,名爲MultipleArray的返回數組僅返回16個數組,而不是25,因爲它應該。任何人都可以發現它爲什麼沒有返回完整的25個陣列?

編輯 - 問題似乎是因爲字母Q在數據庫中沒有數據(這是正確的)數組17(letterQ)沒有內容。構建多元數組的語句然後在此處終止添加數組。任何人都知道我可以解決這個問題?

謝謝。

- (NSMutableArray *)placesInfo { 

NSString *tmpLike = [[NSString alloc] init]; 
multipleArray = [[NSMutableArray alloc] init]; 

for (int i = 0; i < 26; i++) { 

    NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease]; 
    tmpLike = @""; 

    switch (i) { 
     case 0: 
      tmpLike = @"A"; 
      break; 
     case 1: 
      tmpLike = @"B"; 
      break; 
     case 2: 
      tmpLike = @"C"; 
      break; 
     case 3: 
      tmpLike = @"D"; 
      break; 
     case 4: 
      tmpLike = @"E"; 
      break; 
     case 5: 
      tmpLike = @"F"; 
      break; 
     case 6: 
      tmpLike = @"G"; 
      break; 
     case 7: 
      tmpLike = @"H"; 
      break; 
     case 8: 
      tmpLike = @"I"; 
      break; 
     case 9: 
      tmpLike = @"J"; 
      break; 
     case 10: 
      tmpLike = @"K"; 
      break; 
     case 11: 
      tmpLike = @"L"; 
      break; 
     case 12: 
      tmpLike = @"M"; 
      break; 
     case 13: 
      tmpLike= @"N"; 
      break; 
     case 14: 
      tmpLike = @"O"; 
      break; 
     case 15: 
      tmpLike = @"P"; 
      break; 
     case 16: 
      tmpLike = @"Q"; 
      break; 
     case 17: 
      tmpLike = @"R"; 
      break; 
     case 18: 
      tmpLike = @"S"; 
      break; 
     case 19: 
      tmpLike = @"T"; 
      break; 
     case 20: 
      tmpLike = @"U"; 
      break; 
     case 21: 
      tmpLike = @"V"; 
      break; 
     case 22: 
      tmpLike = @"W"; 
      break; 
     case 23: 
      tmpLike = @"X"; 
      break; 
     case 24: 
      tmpLike = @"Y"; 
      break; 
     case 25: 
      tmpLike = @"Z"; 
      break; 
     default: 
      break; 
    } 

NSString *query = [[NSString alloc] initWithFormat: @"SELECT Name, Description, Postcode, AddressLine1, ImageURL, Free, Area, OpeningTimes, NearestTube, Cost,UniqueID, URL, Number, FirstLetter FROM MainDetails WHERE FirstLetter = '%@%'",tmpLike]; 

sqlite3_stmt *statement; 
if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) 
    == SQLITE_OK) { 
    while (sqlite3_step(statement) == SQLITE_ROW) { 

     char *nameChars = (char *) sqlite3_column_text(statement, 0); 
     char *desChars = (char *) sqlite3_column_text(statement, 1); 
     char *postChars = (char *) sqlite3_column_text(statement, 2); 
     char *addyChars = (char *) sqlite3_column_text(statement, 3); 
     char *imageChars = (char *) sqlite3_column_text(statement, 4); 
     char *freeChars = (char *) sqlite3_column_text(statement, 5); 
     char *areaChars = (char *) sqlite3_column_text(statement, 6); 
     char *openChars = (char *) sqlite3_column_text(statement, 7); 
     char *nearChars = (char *) sqlite3_column_text(statement, 8); 
     char *costChars = (char *) sqlite3_column_text(statement, 9); 
     int uniqueID = sqlite3_column_int(statement, 10); 
     char *urlChars = (char *) sqlite3_column_text(statement, 11); 
     char *numberChars = (char *) sqlite3_column_text(statement, 12); 

     NSString *name = [[NSString alloc] initWithUTF8String:nameChars]; 
     NSString *description = [[NSString alloc] initWithUTF8String:desChars]; 
     NSString *postcode = [[NSString alloc] initWithUTF8String:postChars]; 
     NSString *address = [[NSString alloc] initWithUTF8String:addyChars]; 
     NSString *image = [[NSString alloc] initWithUTF8String:imageChars]; 
     NSString *free = [[NSString alloc] initWithUTF8String:freeChars]; 
     NSString *area = [[NSString alloc] initWithUTF8String:areaChars]; 
     NSString *openT = [[NSString alloc] initWithUTF8String:openChars]; 
     NSString *near = [[NSString alloc] initWithUTF8String:nearChars]; 
     NSString *cost = [[NSString alloc] initWithUTF8String:costChars]; 
     NSString *url = [[NSString alloc] initWithUTF8String:urlChars]; 
     NSString *number = [[NSString alloc] initWithUTF8String:numberChars]; 

     PlaceObject *info = [[PlaceObject alloc] 
          initWithUniqueID: uniqueID name : name description:description postCode:postcode addressOne : address image:image free:free area:area openingTimes:openT nearestTube:near cost:cost url:url number:number]; 


     [retval addObject:info]; 

     int x= [retval count]; 

     NSLog(@"%d",i); 

     if (x ==0) { 

      NSLog(@"No content"); 
     } 


    switch (i) { 
      case 0: 
      letterA = retval; 
      break; 
      case 1: 
      letterB = retval; 
      break; 
      case 2: 
       letterC = retval; 
       break; 
      case 3: 
       letterD = retval; 
       break; 
      case 4: 
       letterE = retval; 
       break; 
      case 5: 
       letterF = retval; 
       break; 
      case 6: 
       letterG = retval; 
       break; 
      case 7: 
       letterH = retval; 
       break; 
      case 8: 
       letterI = retval; 
       break; 
      case 9: 
       letterJ = retval; 
       break; 
      case 10: 
       letterK = retval; 
       break; 
      case 11: 
       letterL = retval; 
       break; 
      case 12: 
       letterM = retval; 
       break; 
      case 13: 
       letterN = retval; 
       break; 
      case 14: 
       letterO = retval; 
       break; 
      case 15: 
       letterP = retval; 
       break; 
      case 16: 
       letterQ = retval; 
       break; 
      case 17: 
       letterR = retval; 
       break; 
      case 18: 
       letterS = retval; 
       break; 
      case 19: 
       letterT = retval; 
       break; 
      case 20: 
       letterU = retval; 
      break; 
      case 21: 
       letterV = retval; 
       break; 
      case 22: 
       letterW = retval; 
       break; 
      case 23: 
       letterX = retval; 
      break; 
      case 24: 
       letterY = retval; 
       break; 
      case 25: 
       letterZ = retval; 
       break; 
     default: 
      break;      
    } 
     [name release]; 
     query = @""; 
     [query release]; 
     [description release]; 
     [url release]; 
     [number release]; 
     [postcode release]; 
     [address release]; 
     [image release]; 
     [free release]; 
     [area release]; 
     [openT release]; 
     [near release]; 
     [cost release]; 
     [info release]; 
    } 
    sqlite3_finalize(statement); 
} 

} 

tmpLike = @""; 
[tmpLike release]; 

multipleArray = [NSMutableArray arrayWithObjects: letterA, letterB, letterC, letterD, letterE, letterF, letterG, letterH, letterI, letterJ, letterK, letterL, letterM, letterN, letterO,letterP, letterQ, letterR, letterS, letterT, letterU, letterV, letterW, letterX, letterY, letterZ, nil]; 

int x= [multipleArray count]; 
NSLog(@"Mulptilpe Array Contents: %d", x); 
NSLog(@"%@",multipleArray); 
return multipleArray; 
} 
+0

爲什麼這個醜陋的開關?使用ASCII數據值! tmpLike = [NSString stringWithFormat:@「%c」,(char)i +'A'];並且不需要在之前初始化tmpLike,你在第3行有內存泄漏!我還沒有看到你在哪裏定義了你的字母[A-Z],但是你也可以使用正確索引的數組no? – Geoffroy

回答

2

編輯 - 問題似乎是因爲字母Q在數據庫中沒有數據(這是正確的)數組17(letterQ)沒有內容。構建多元數組的語句然後在此處終止添加數組。任何人都知道我可以解決這個問題?

如果您需要將nil的值插入到您的陣列中,請使用[NSNull null]。這個價值沒有什麼神奇的。這只是一個可以稍後測試的對象。您無法將實際的nil插入到NSMutableArray中。

1

我會從簡化代碼開始。兩個大開關語句是不必要的。 你可以通過擺脫tmpLike變量,並與更換 查詢字符串掛斷第一個:

NSString *query = [[NSString alloc] initWithFormat: @"SELECT ...blah blah blah... WHERE FirstLetter = '%c%'", 'A' + i]; 

我承擔LETTERA ... letterZ是宣佈別處NSMutableArray秒。通過簡單地將retval添加到multipleArray,您可以擺脫第二個開關語句 和所有letter*陣列。

[multipleArray addObject:retval] 

這樣,你正在逐步建立multipleArray,而不是試圖在最後一次建造這一切。此外,如果查詢失敗的任何一個字母,只有該字母將會丟失。下列字母仍將被添加。

1

我會給出一些關於基本字符的提示,這會爲您節省很多代碼!你可以對它們進行算術來改變字母。

unichar letter = L'A' + i; 
tempLike = [NSString stringWithCharacters:&letter length:1]; 

現在的實際問題是你需要檢查每個對象的零,因爲一旦你通過零定點的方法它認爲這是結束了自定義對象(通常爲[NSNull null])替換它。

1

我會建議你。實現在進入數據庫之前檢查字符串的代碼。如果字符串爲空,則用@「」替換(空白)。 感謝

1

你的第二個開關語句之前試試這個:

if (!retval) { 
    retval = [NSMutableArray arrayWithObject:[NSNull null]]; 
} else if (![retval count]) { 
    [retval addObject:[NSNull null]]; 
    NSLog(@"No content"); 
} 
....