2011-01-14 43 views
0

我從數據庫中獲取數據,我需要添加字符串字段值和記錄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]; 

回答

0

錯誤消息說你要發送「計數」來的NSString的一個實例。

我的猜測是plist在'path'(plist文件)有一個字符串作爲值之一。在遍歷'Categories'時,您希望每個值都是一個數組(即'NSMutableArray * array = [Categories valueForKey:key];'),併發送該值爲'count'消息。

您期望成爲數組的對象之一是一個字符串。

+0

我剛看過一個文件,看看我上面的編輯,圖像......我認爲那將是根?我應該怎麼做才能解決這個問題? – Jules 2011-01-14 15:04:41

0
  • setValue是鍵值編碼方法。您應該改用setObject:forKey:
  • arrayTmp應與[[NSMutableDictionary alloc] init]匹配。
+0

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

0

首先,你用錯了方法:

[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