2010-04-14 3 views
0

Я пытаюсь создать NSDictonary, который можно использовать для заполнения списка с данными, полученными из инструкции SQL. когда я иду создавать массив и добавляю его, он добавляет массивы для ВСЕХ моих ключей, а не только для текущего ключа. Я попробовал removeAllObjects в массиве, но по какой-то причине он уничтожает ВСЕ мои данные, которые я уже вставлял в словарь.Создание NSDictionary из SQL-запроса

//open the database 

if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
{ 
    const char *sql = "select alphaID, word from words order by word"; 
    sqlite3_stmt *selectStatement; 

    //prepare the select statement 
    int returnValue = sqlite3_prepare_v2(database, sql, -1, &selectStatement, NULL); 
    if(returnValue == SQLITE_OK) 
    { 
    NSMutableArray *NameArray = [[NSMutableArray alloc] init]; 
    NSString *alphaTemp = [[NSString alloc] init]; 
    //loop all the rows returned by the query. 
    while(sqlite3_step(selectStatement) == SQLITE_ROW) 
    { 
    NSString *currentAlpha = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 1)]; 
    NSString *definitionName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 2)]; 

    if (alphaTemp == nil){ 
    alphaTemp = currentAlpha; 
    } 

    if ([alphaTemp isEqualToString:(NSString *)currentAlpha]) { 
    [NameArray addObject:definitionName]; 

    } 
    else if (alphaTemp != (NSString *)currentAlpha) { 
    [self.words setObject:NameArray forKey:currentAlpha]; 
    [NameArray removeAllObjects]; 
    [NameArray addObject:definitionName]; 
    } 
    } 
    } 

Вышеприведенное заявление добавляет все «ключи», а затем удаляет все элементы массива для всех ключей. если я вытащил removeAllKeys, он добавит ВСЕ элементы массива для ВСЕХ ключей. Я не хочу этого, я хочу, чтобы он добавлял элементы массива для конкретного ключа, а затем переходил к следующему ключу.

в конце концов, я хочу NSDictonary с

А (массив)
Alpha (строка)
Яблоко (строка)
B (массив)
Beta (строка)
Болл (строка)
C (массив)
код (строка)
...

ответ

2

Хотя я не думаю, что это влияет на вашу проблему, от того, как я прочитал ваш код, вы должны изменить

NSString *alphaTemp = [[NSString alloc] init]; 

в

NSString *alphaTemp = nil; 

так alphaTemp просто используется, чтобы указать на NSString, который сгенерированный первоначально как currentAlpha. Вы также должны позвонить [NameArray release] в какой-то момент ниже кода, который вы указали, так как вы alloc 'd it.

Реальная проблема заключается в том, что вы постоянно прибавляя указатели на жеNSMutableArray к вашему NSDictionary (self.words). Я вижу два пути, чтобы исправить это:

Изменить

[self.words setObject:NameArray forKey:currentAlpha]; 

в

[self.words setObject:[NSArray arrayWithArray:NameArray] forKey:currentAlpha]; 

так, что вы добавляете вновь созданные (не изменяемый) NSArrayNSDictionary вашему.

- или -

Вставка

[NameArray release]; 
NameArray = [[NSMutableArray alloc] init]; 

после

[self.words setObject:NameArray forKey:currentAlpha]; 

так, что как только вы вставили NSMutableArray в NSDictionary, вы создаете новый NSMutableArray для следующего прохода.

+0

Это имеет смысл. Спасибо.Мне кажется странным, что изменение изменчивого массива после того, как он помещается в словарь, влияет на его результаты, но это вызывающе то, что происходит. –

+0

Проблема заключается в том, что помещение массива в словарь действительно помещает указатель на этот один массив (а не копию массива) в словарь, поэтому ваш исходный код имел тот же указатель на один массив для каждой записи в словаре , – Isaac

+0

Да, и это точно описывает, что происходит. Сбрасывание копии отлично работает. Это действительно применимо ко многим из моих проблем. Мое конечное приложение будет иметь возможность удалять данные из базы данных SQL, XML и .plists в «общий» формат словаря, который можно использовать в приложении. Мне понадобится этот метод несколько раз. –

Смежные вопросы