2011-09-28 7 views
1

아래의 메서드 코드는 SQLite 데이터베이스에서 26 개의 배열 (알파벳의 각 문자 하나씩)을 만드는 FOR 루프입니다.For 루프 및 배열에 대한 문제

MultipleArray라는 반환 배열은 16 개의 배열 만 반환하고 25 개는 반환하지 않는 것이 문제입니다. 누구나 왜 전체 25 배열을 반환하지 않는지 확인할 수 있습니까?

EDIT - 문자 Q에는 데이터베이스에 데이터가 없으므로 (올바른) 배열 17 (letterQ)에 내용이없는 것 같습니다. mulptipleArray를 작성하는 문은이 시점에서 배열 추가를 종료합니다. 누구든지이 문제를 어떻게 해결할 수 있는지 알고 있습니까?

감사합니다.

- (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]를 정의한 곳을 보지 못했지만, 올바르게 색인 된 배열을 사용할 수도 있습니다. – Geoffroy

답변

2

EDIT - 문자 Q에는 데이터베이스에 데이터가 없으므로 (올바른) 배열 17 (letterQ)에는 내용이없는 것으로 보입니다. mulptipleArray를 작성하는 문은이 시점에서 배열 추가를 종료합니다. 누구든지이 문제를 어떻게 해결할 수 있는지 알고 있습니까?

배열에 nil 값을 삽입해야하는 경우 [NSNull null]을 사용합니다. 이 값에 관해서는 이상한 것이 없습니다. 그것은 단지 나중에 테스트 할 수있는 객체입니다. NSMutableArray에 실제 nil을 삽입 할 수 없습니다.

1

나는 코드를 단순화함으로써 시작할 것입니다. 두 개의 큰 switch 문은 필요하지 않습니다. 당신은 tmpLike 변수 제거와 함께 쿼리 문자열을 교체하기로 첫 번째 드롭 얻을 수 있습니다 :

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

나는 letterA ... letterZ 가정은 다른 곳에서 선언 NSMutableArray들입니다. retvalmultipleArray에 간단히 추가하여 두 번째 스위치 명령문 과 모든 letter* 어레이를 제거 할 수 있습니다.

[multipleArray addObject:retval] 

증분 한 번에 말에 모두 구축을 위해 노력보다는 multipleArray을 구축하고 그런 식으로. 또한 한 문자에 대해 쿼리가 실패하면 해당 문자 만 누락됩니다. 다음 문자가 계속 추가됩니다.

1

많은 코드를 저장하는 기본 문자에 대해 약간의 힌트를 제공 할 것입니다. 글자를 바꾸기 위해 산술을 수행 할 수 있습니다.

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

지금 실제 문제는 전무에 대한 각 개체를 확인하고 방법에 전무 감시 합격 한 후 그것이 끝이라고 생각하기 때문에 사용자 지정 개체 (일반적으로 [NSNull null])로 교체 할 필요가있다.

1

나는 당신을 제안 할 것이다. 데이터베이스에 입력하기 전에 문자열을 검사하는 코드를 구현합니다. string가 null의 경우, @ ""(공백)로 옮겨 놓습니다. 감사

1

두 번째 스위치 문 앞에이 시도 :

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