Objective c 使用带有NSDate的NSPredicate筛选数据表

Objective c 使用带有NSDate的NSPredicate筛选数据表,objective-c,nsdate,nspredicate,Objective C,Nsdate,Nspredicate,当我将NSPredicate应用于DaDataTable行,并将结果存储在NSMutableArray中时,使用NSPredicate过滤DaDataTable时,我遇到了一个问题 假设我有下表 Field1 2013-04-10 05:00:00 +0000 2013-04-10 05:00:00 +0000 2013-04-11 05:00:00 +0000 2013-04-11 05:00:00 +0000 2013-04-12 05:00:00 +0000 而且,NSPredicate

当我将
NSPredicate
应用于
DaDataTable
行,并将结果存储在
NSMutableArray
中时,使用
NSPredicate
过滤
DaDataTable
时,我遇到了一个问题

假设我有下表

Field1
2013-04-10 05:00:00 +0000
2013-04-10 05:00:00 +0000
2013-04-11 05:00:00 +0000
2013-04-11 05:00:00 +0000
2013-04-12 05:00:00 +0000
而且,
NSPredicate

NSPredicate *predicate = [@"" stringByAppendingFormat:@"(%@ == ‘%@‘)”, filter.realField, filter.value];
其中,
filter.realField
Field1
filter.value
是我想要使用的
NSDate
,假设它是
2013-04-10 05:00:00+0000

理论上,它应该返回一个包含两行的
NSMutableArray
。但正如我前面所说的,它总是返回一个包含零行的数组

下面是使用谓词过滤
DADataTable
dataTable
)的代码,其中包含我前面提到的表

    if (predicate) {
        NSMutableArray *array = [NSMutableArray arrayWithArray:[dataTable rowsFilteredUsingPredicate:predicate]];
        if (array.count > 0) {
            [dataTable setRows:array];
            return YES;
        }
        else {
            //Alert that says the array is empty…
            return NO;
        }
    }
    else {
        return NO;
    }
如果我试图在两个
NSDate
之间设置一个范围,一个包含我在谓词中选择使用的日期(
2013-04-10 05:00:00+0000
),另一个包含该日期的第二天(
2013-04-11 05:00:00+0000
)。为了获得第二天的信息,我使用了德语中的Zaky代码

但是在这种情况下,我像这样更改了
NSPredicate

NSPredicate *predicate = [@"" stringByAppendingFormat:@"(%@ >= ‘%@‘) AND (%@ <= ‘%@‘)”, filter.realField, filter.value, filter.realField, nextDay];

我希望你能帮我解决这个问题,并提前感谢

您没有正确创建谓词。您正在创建一个NSString对象,然后将其作为谓词进行类型转换,并将其传递给数组。这就解释了你得到的错误。NSString对象无法响应NSPredicate的选择器,这会引发异常

创建如下谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%K >= %@) AND (%K < %@)", keyPath, value, otherKeyPath, otherValue];
NSPredicate*谓词=[NSPredicate谓词格式:@“(%K>=%@)和(%K<%@)”,键路径,值,其他键路径,其他值];

请注意,我如何使用%K表示关键路径,而使用%@表示值。这很重要。你应该在直接跳进去之前先读一下这本书。理解objective-c语法也很重要,其中@“”是NSString对象

谢谢你!!成功了。我想是因为在过去,我为了同样的目的而使用
%@
,而不是
%K
,而且它很有效,我一直以同样的方式使用它。。。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%K >= %@) AND (%K < %@)", keyPath, value, otherKeyPath, otherValue];