NSMutableDictionary混淆了如何使用密钥与某些代码?

问题描述:

我从数据库中获取数据,我需要添加字符串字段值和记录ID。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]; 

错误消息说你要发送“计数”来的NSString的一个实例。

我的猜测是plist在'path'(plist文件)有一个字符串作为值之一。在遍历'Categories'时,您希望每个值都是一个数组(即'NSMutableArray * array = [Categories valueForKey:key];'),并发送该值为'count'消息。

您期望成为数组的对象之一是一个字符串。

+0

我刚看过一个文件,看看我上面的编辑,图像......我认为那将是根?我应该怎么做才能解决这个问题? – Jules 2011-01-14 15:04:41

  • setValue是键值编码方法。您应该改用setObject:forKey:
  • arrayTmp应与[[NSMutableDictionary alloc] init]匹配。
+0

谢谢,但那不行。 – Jules 2011-01-14 14:46:58

首先,你用错了方法:

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

其用于键 - 值编码方法(你可以找到更多关于KVO here)。

你正在寻找的方法是:

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

此外,你应该的NSMutableDictionary。你使用的NSDictionary不支持变异。 (你可以在NSMutableDictionary here上找到更多信息)。

干杯, 帕维尔

+0

是啊你的权利,我只是尝试NSMutableDictionary,但我得到一个新的错误***终止应用程序由于未捕获异常'NSInvalidArgumentException',原因:' - [NSCFString计数]:无法识别的选择发送到实例0x4d4c500' ** *一次调用堆栈: – Jules 2011-01-14 14:39:13