NSPredicate - 包含不按预期运行

时间:2014-11-30 22:12:36

标签: ios nsmutablearray nsarray nsdictionary nspredicate

我在NSMutableArray上使用NSPredicate,如下所示,从XML表填充

//Get XML Data
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"breosla_db" ofType:@"xml"];
NSDictionary *xmlDoc = [NSDictionary dictionaryWithXMLFile:filePath];
//Place in Mutable Array
NSMutableArray *data = [xmlDoc valueForKeyPath:@"row"];
NSLog(@"Data %@", data[0]);

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"ID contains[c] '2'"];
NSArray *filtered = [data filteredArrayUsingPredicate:bPredicate];

日志中的数据如下所示:

Data {
ID =     (
    2
);
address1 =     (
    "123 Fake Street"
);
address2 =     (
    "A Sleepy Town"
);
address3 =     (
);
county =     (
);
licenseNo =     (
    12345
);
licenseType =     (
    "Trader"
);
licenseeName =     (
    "Mr. Trader"
);
nominessName =     (
);
tradingName =     (
    "Trading Shop"
);

}

当前谓词:

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"ID contains[c] '2'"];

仅返回ID == 2的数据,例如,它不会返回12,22,42等。

其次,我不能通过例如所有包含' e':

的名称
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"tradingName contains[c] 'e'"];

'数据' NSMutableArray在每个位置包含与日志中显示的数据类似的数据。

2 个答案:

答案 0 :(得分:1)

看起来您的数据包含一个字典数组,每个字典键的值也是(单个元素)数组。你可以看到这个,因为你的日志显示

ID =     (
    2
);
etc

()表示数组。因此,要使您的谓词起作用,您需要使用' ANY',如下所示:

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"ANY ID contains[c] '2'"];

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"ANY tradingName contains[c] 'e'"];

但是您可能会更好地重新构建数据,以便值不会嵌入到数组中。

答案 1 :(得分:0)

您的谓词似乎只适用于ID或tradingName。假设data [0]拥有完整的xml元素,而是使用以下内容;

NSPredicate *idPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] '2'"];
[data filterUsingPredicate:idPredicate];

对于包含'e'的tradingName:

NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'e'"];
[data filterUsingPredicate:namePredicate];

请检查此reference以获取更多帮助。