1

IN 运算符是否适用于过滤 SBElementArrays?我一直在尝试使用它,但它总是返回一个 NULL 数组。

我的代码(hexArray 通常会有更多元素):

SBElementArray *musicTracks = [libraryPlaylist fileTracks];
hexArray = [NSArray arrayWithObject: @"3802BF81BD1DAB10"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY %K IN %@",@"persistentID",hexArray];

NSLog(@"%@", [[musicTracks filteredArrayUsingPredicate:predicate] valueForKey:@"persistentID"]);
NSLog(@"%@", hexArray);
NSLog(@"%@", predicate);

输出:

2013-05-26 12:59:29.907 test[1226:403] (null)
2013-05-26 12:59:29.907 test[1226:403] (3802BF81BD1DAB10)
2013-05-26 12:59:29.908 test[1226:403] ANY persistentID IN {"3802BF81BD1DAB10"}

我尝试将谓词设置为:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY %K == %@",@"persistentID",hexArray];

输出:

2013-05-26 13:03:04.629 test[1258:403] (3802BF81BD1DAB10)
2013-05-26 13:03:04.630 test[1258:403] (3802BF81BD1DAB10)
2013-05-26 13:03:04.630 test[1258:403] ANY persistentID == {"3802BF81BD1DAB10"}

这很好用。但我想要 IN 功能。

4

5 回答 5

2

而不是做

persistentID IN ('abc', 'abc', 'abc', ...)

你可以做

persistentID == 'abc' OR persistentID == 'abc' OR ...

它似乎工作得很快。


NSMutableArray *subPredicates = [NSMutableArray arrayWithCapacity:persistentIDs.count];

for (NSNumber *persistentID in persistentIDs) {
    [subPredicates addObject:pred(@"persistentID == %@", persistentID.hexValue)];
}

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
[tracks filterUsingPredicate:predicate];

NSLog(@"%ld", tracks.count);
于 2013-11-23T12:39:39.050 回答
0

尝试使用CONTAINS[c]

前任:-

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY %@ CONTAINS[c] %k",hexArray, @"persistentID"];
于 2013-05-26T13:05:53.590 回答
0

如果我正确理解您的意图,您的谓词应该是%K IN %@(不带ANY)(获取数组中具有其中一个 ID 的所有轨道)。

由于某种原因,这不适用于,但您可以在应用谓词之前将SBElementArray其简单地转换为常规( an也应该工作,并且可能更有效):NSArrayNSSet

SBElementArray *musicTracks = [libraryPlaylist fileTracks];
NSArray *musicTracksArray = [NSArray arrayWithArray:musicTracks];

NSArray *hexArray = [NSArray arrayWithObjects: @"CE24B292556DB1BA", @"CE24B292556DB1F0", @"CE24B292556DB1C4", nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K IN %@", @"persistentID", hexArray];
NSLog(@"%@", [[musicTracksArray filteredArrayUsingPredicate:predicate] valueForKey:@"persistentID"]);
于 2013-05-26T14:02:08.900 回答
0

我最终只是循环遍历所有元素hexArray并在每次传递中使用相等谓词。可能不是最有效的,但它确实有效。

for (NSString *hexID in hexArray){
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"persistentID == %@",hexID];
        iTunesTrack *track = [[musicTracks filteredArrayUsingPredicate:predicate] objectAtIndex:0];
        [track duplicateTo:playlist];
    }
于 2013-05-26T13:51:59.970 回答
0

Scripting Bridge 在技术上支持 IN 运算符,因为它将为其构造一个格式正确的 Apple 事件,但大多数应用程序不理解它。最好的解决方法是 NSAddict 建议的链式 OR 测试。

于 2014-12-04T00:05:00.027 回答