0

私は物でNSArrayいっぱいですNSDictionary。この構造はデータベースから構築されています。デバッグ時にのみ含まれて実行される検証関数を構築しています。アイデアは、必要なすべてのファイルが実際に含まれていることと、余分なファイルが含まれていないことを確認することです。

この質問に基づいて、私はを使用しようとしましたNSPredicateが、ディレクトリ内のすべてのファイルに「データベースにないファイル」としてフラグを立てています。

私は何が間違っているのですか?

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
4

2 に答える 2

1

述語の形式を「%K ==%@」にしたいと思います。

于 2012-04-07T21:35:21.687 に答える
0

この行を変更します。

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

これに:

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

%Kは、引数が文字列ではなく動的プロパティ名であることを示しています(したがって、引数は引用符で囲まれていません)。

于 2012-04-07T21:37:26.570 に答える