2011-01-14 4 views
0

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

Однако, мне это нужно для работы с некоторым существующим кодом ...

Я замена этого (см код ниже) и получать данные из моей базы данных.

NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 
self.allCategories = dict; 
[dict release]; 

Это файл загружает ...

alt text

Но нужно работать с этими ключевыми и стоимостными функциями поиска.

- (void)resetSearch { 
NSMutableDictionary *allCategoriesCopy = [self.allCategories mutableDeepCopy]; 
self.Categories = allCategoriesCopy; 
[allCategoriesCopy release]; 
NSMutableArray *keyArray = [[NSMutableArray alloc] init]; 
[keyArray addObject:UITableViewIndexSearch]; 
[keyArray addObjectsFromArray:[[self.allCategories allKeys] 
          sortedArrayUsingSelector:@selector(compare:)]]; 
self.keys = keyArray; 
[keyArray release]; 
} 

.

- (void)handleSearchForTerm:(NSString *)searchTerm { 
NSMutableArray *sectionsToRemove = [[NSMutableArray alloc] init]; 
[self resetSearch]; 

for (NSString *key in self.keys) { 
    NSMutableArray *array = [Categories valueForKey:key]; 
    NSMutableArray *toRemove = [[NSMutableArray alloc] init]; 
    for (NSString *name in array) { 
     if ([name rangeOfString:searchTerm 
         options:NSCaseInsensitiveSearch].location 
                 == NSNotFound) 
      [toRemove addObject:name]; 
    } 

    if ([array count] == [toRemove count]) 
     [sectionsToRemove addObject:key]; 

    [array removeObjectsInArray:toRemove]; 
    [toRemove release]; 
} 
[self.keys removeObjectsInArray:sectionsToRemove]; 
[sectionsToRemove release]; 
[table reloadData]; 
} 

получает сообщение об ошибке из этого кода ...

NSDictionary *arrayTmp= [[NSDictionary alloc] init]; 

... loop records 

int cid = sqlite3_column_int(statementTMP, 0); 
NSString *category = [[NSString alloc] 
    initWithUTF8String:(char *)sqlite3_column_text(statementTMP, 1)]; 

[arrayTmp setObject:category forKey:[NSString stringWithFormat:@"%i", cid]]; 

Ошибки вызвана линией выше

* Нагрузочное приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: «- [ NSCFString count]: непризнанный селектор, отправленный на экземпляр 0x4d4c500 '* Счетный стек при первом броске *

... end loop 

self.allCategories = arrayTmp; 
[arrayTmp release]; 

ответ

0

Сообщение об ошибке говорит, что вы отправляете «количество» на экземпляр NSString.

Я предполагаю, что plist в 'path' (файл plist) имеет строку в качестве одного из значений. Когда вы повторяете «Категории», вы ожидаете, что каждое значение будет массивом (т. Е. «NSMutableArray * array = [Categories valueForKey: key];») и отправить это значение в сообщение «count».

Одним из объектов, которые вы ожидаете быть массивом, является строка.

+0

Я только что посмотрел файл, посмотрю мое редактирование выше, изображение ... Я думаю, что это будет root? Что я должен сделать, чтобы это решить? – Jules

+0

root - это словарь, поэтому нет, это не так, одна из вещей, которые вы считаете массивом, - это строка. запустите приложение в отладчике, получите трассировку стека, где он взорван, найдите трассировку стека, пока не дойдете до вашего кода. ObjectObject: forKey: не имеет ничего общего с этим сообщением об ошибке ... –

+0

Да, ваше право, но я «Не знаю, как это сделать. – Jules

0
  • setValue - метод кодирования ключа. Вместо этого вы должны использовать setObject:forKey:.
  • arrayTmp должно быть включено в [[NSMutableDictionary alloc] init].
+0

Спасибо, но это не сработает. – Jules

0

Прежде всего, вы используете неправильный метод:

[arrayTmp setValue:category forKey:[NSString stringWithFormat:@"%i", cid]];

, какой метод используется для ключевого значения кодирования (вы можете узнать больше о KVO here).

Метод вы ищете это:

[arrayTmp setObject:category forKey:[NSString stringWithFormat:@"%i", cid]];

Кроме того, вы должны NSMutableDictionary. Используемый NSDictionary не поддерживает мутацию. (вы можете найти более подробную информацию о NSMutableDictionary here).

Приветствия, Pawel

+0

Да, ваше право, я просто попробовал NSMutableDictionary, но я получаю новую ошибку *** Завершение приложения из-за неотображенного исключения «NSInvalidArgumentException», причина: '- [NSCFString count]: непризнанный селектор, отправленный на экземпляр 0x4d4c500' ** * Стек вызова при первом броске: – Jules

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