Проблема с For Loop и Array - PullRequest
       2

Проблема с For Loop и Array

1 голос
/ 28 сентября 2011

Приведенный ниже код метода представляет собой цикл FOR, который создает 26 массивов (по одному на каждую букву алфавита) из базы данных SQLite.

Проблема в том, что возвращаемый массив MultipleArray возвращает только 16 массивов, а не 25, как должно.Может кто-нибудь определить, почему он не возвращает полные 25 массивов?

РЕДАКТИРОВАТЬ - Кажется, проблема в том, что, поскольку буква Q не имеет данных в базе данных (что правильно), массив 17 (буква Q) не имеет содержимого,Оператор, который строит 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;
}

Ответы [ 5 ]

2 голосов
/ 28 сентября 2011

РЕДАКТИРОВАТЬ - Кажется, проблема в том, что, поскольку буква Q не имеет данных в базе данных (что правильно), массив 17 (буква Q) не имеет содержимого.Оператор, который строит mulptipleArray, затем завершает добавление массивов в этой точке.Кто-нибудь знает, как я могу это исправить?

Если вам нужно вставить значение nil в ваш массив, вы используете [NSNull null].В этом значении нет ничего волшебного.Это просто объект, который вы можете позже проверить.Вы не можете вставить настоящий nil в NSMutableArray.

1 голос
/ 28 сентября 2011

Попробуйте это перед вашим вторым оператором switch:

if (!retval) {
    retval = [NSMutableArray arrayWithObject:[NSNull null]];
} else if (![retval count]) {
    [retval addObject:[NSNull null]];
    NSLog(@"No content");
}
....
1 голос
/ 28 сентября 2011

Я бы предложил вам.реализовать код, который проверяет строку перед вводом в базу данных.если строка равна нулю, замените на @ "" (пусто).Спасибо

1 голос
/ 28 сентября 2011

Я собираюсь дать небольшую подсказку об основных символах, которые сэкономят вам много кода!вы можете выполнять арифметику для них, чтобы изменить буквы.

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

Теперь проблема в том, что вам нужно проверить каждый объект на ноль и заменить его на собственный объект (обычно [NSNull null]), потому что, как только вы передадитеноль стража к методу, который думает, что это конец.

1 голос
/ 28 сентября 2011

Я бы начал с упрощения вашего кода. Два больших оператора switch не нужны. Вы можете отказаться от первого, избавившись от переменной tmpLike и заменив Строка запроса с:

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

Я предполагаю, что буква A ... letterZ * объявлена ​​где-то в другом месте. Вы можете избавиться от второго оператора switch и все массивы letter*, просто добавив retval к multipleArray.

[multipleArray addObject:retval]

Таким образом, вы постепенно создаете multipleArray, а не пытаетесь собрать все сразу в конце. Также, если запрос не выполняется для какой-либо одной буквы, будет пропущена только эта буква. Следующие буквы все равно будут добавлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...