搜索NSArray的NSDrray以验证信息

时间:2012-04-07 20:58:44

标签: objective-c nspredicate

我有NSArrayNSDictionary个对象。此结构是从数据库构建的。我正在构建一个仅在调试时包含并执行的验证功能。我们的想法是确保所有文件都包含在内,并且不包含任何额外的文件。

基于this问题,我尝试使用NSPredicate,但它将thr目录中的每个文件标记为“文件不在数据库中”。

我做错了什么?

KEY_DFILE #defined为@"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

2 个答案:

答案 0 :(得分:1)

我认为您希望您的谓词格式为"%K ==%@"。

答案 1 :(得分:0)

更改此行:

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

对此:

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

%K表示参数是动态属性名称而不是字符串(因此它不引用它)。