2012-04-07 45 views
0

我有一個NSArray完整的NSDictionary對象。這個結構是從數據庫建立的。我正在構建一個僅在調試時包含並執行的驗證功能。這個想法是確保所有需要的文件都包含在內,並且不包含任何額外的文件。正在搜索NS數組的NSArray以驗證信息

基於this問題我嘗試使用NSPredicate,但它將thr目錄中的每個文件標記爲「文件不在數據庫中」。

我在做什麼錯?

KEY_DFILE#定義爲@"dFilename"

#ifdef DEBUG 
- (void)checkItems 
{ 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSLog(@"-------- Database/File Check --------"); 
    for (NSDictionary* item in self.allItmes) 
    { 
     // ansi items 
     if ([[item objectForKey:KEY_TYPE] isEqualToString:@"ansi"]) 
     { 
      // Make sure the datafile exists 
      NSString* path = [[NSBundle mainBundle] pathForResource:[item objectForKey: KEY_DFILE] ofType:nil inDirectory:@"ansi"]; 
      if (![fileManager fileExistsAtPath:path]) 
       NSLog(@"Can't find file: %@", path); 
     } 
    } 

    NSString *dir = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"ansi"]; 
    NSDirectoryEnumerator* en = [fileManager enumeratorAtPath:dir]; 
    NSString* file; 
    while (file = [en nextObject]) 
    { 
     NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ == %@", KEY_DFILE, file]; 
     NSArray *matchedDicts = [self.allItmes filteredArrayUsingPredicate:p]; 
     if ([matchedDicts count] == 0) 
     { 
      NSLog(@"File not in Database: %@", file); 
     } 
     else if ([matchedDicts count] > 1) 
     { 
      NSLog(@"File in Database more than once: %@", file); 
     } 
    } 
    NSLog(@"---------------------------------------"); 
} 
#endif 

回答

0

改變這一行:

NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ == %@", KEY_DFILE, file]; 

要這樣:

NSPredicate *p = [NSPredicate predicateWithFormat:@"%K == %@", KEY_DFILE, file]; 

的%K說,參數是一個動態屬性名稱,而不是一個字符串(所以它不會引用它) 。

1

我想你希望你的謂詞格式是「%K ==%@」。