Я пытаюсь создать 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 (массив)
код (строка)
...
Это имеет смысл. Спасибо.Мне кажется странным, что изменение изменчивого массива после того, как он помещается в словарь, влияет на его результаты, но это вызывающе то, что происходит. –
Проблема заключается в том, что помещение массива в словарь действительно помещает указатель на этот один массив (а не копию массива) в словарь, поэтому ваш исходный код имел тот же указатель на один массив для каждой записи в словаре , – Isaac
Да, и это точно описывает, что происходит. Сбрасывание копии отлично работает. Это действительно применимо ко многим из моих проблем. Мое конечное приложение будет иметь возможность удалять данные из базы данных SQL, XML и .plists в «общий» формат словаря, который можно использовать в приложении. Мне понадобится этот метод несколько раз. –