2011-02-17 166 views
1

編輯:忽略此問題。我沒有正確地查看我的測試數據。我的代碼如下。 但是有一些很好的答案。謝謝!NSPredicate比較字符串小於其他字符串

爲方便起見,我們將所有數據作爲字符串存儲在覈心數據中。現在我想獲取具有比指定時間戳(oldDate)更早的時間戳的實體的所有對象。這意味着我想與NSPredicate進行比較,以便NSFetchRequest返回時間戳小於指定時間戳的對象。以下顯然不起作用,但它是我迄今爲止最好的。

- (void)deleteRecordsOlderThan:(NSString*)oldDate { 
    NSError *error = nil; 
    NSFetchRequest *request =[[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:tableName inManagedObjectContext:context]]; 
    [request setIncludesPropertyValues:NO]; 
    [request setIncludesPendingChanges:YES]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timestamp < %@)",oldDate]; 
    NSLog(@"Predicate: %@",predicate); 
    [request setPredicate:predicate]; 

    NSArray *filteredObjects = [context executeFetchRequest:request error:&error]; 
    [request release]; 
    if (error) { 
     NSLog(@"Error fetching objects for deletion: %@", [error description]); 
     return; 
    } 
    NSLog(@"Number of old objects to delete:%d",filteredObjects.count); 
    for (NSManagedObject * nsObject in filteredObjects) { 
     [context deleteObject:nsObject]; 
    } 
} 

}

我希望你明白我的意思。這有點難以解釋。

回答

3

如果你能支撐塊,那麼你可以寫這樣的斷言:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^(id evaluatedObject, NSDictionary *bindings) { 
    return ([[NSDate dateWithTimeIntervalSince1970:[[evaluatedObject timestamp] doubleValue] timeIntervalSinceDate:oldDate] < 0); 
}]; 

所有這一切確實是使一個NSDate你的字符串(假設這是自1970年以來時間戳),然後檢查查看自oldDate以來的時間間隔是否小於零,表明它在oldDate之前。修改不平等來適應你的邏輯。

0

您可以更改核心數據實體,以便它存儲日期而不是表示日期的字符串。

這將使這非常容易。

+0

我知道,但由於其他原因,我不能這樣做。我不是數據模型的所有者。 – sanna 2011-02-17 10:15:46

0

如果因爲參考日期時間戳存儲爲秒,如Unix紀元,那麼你可以使用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timestamp < %@)", [NSString stringWithFormat:@"%lf", [oldDate timeIntervalSince1970]]]; 

檢查NSDate documentation,這些實例方法返回NSTimeInterval這實際上只是一個雙。

+0

如果時間戳在數據模型中具有String類型,這是否工作?如果是日期或數字,我不會有這個問題。 – sanna 2011-02-17 11:09:04

+0

稍微更改此答案。我很確定NSPredicate足夠聰明,可以爲NSStrings調用正確的compare:方法。 – 2011-02-17 12:11:58

0

這取決於如何存儲日期,例如「2010-02-17」或自1970年以來的秒數,但我想添加一個瞬態屬性將是最簡單的解決方案(旁邊更改日期屬性,你說你不能這樣做)。

瞬態屬性是一種數據模型屬性,它不保存在數據庫中,而是每次計算。所以你可以創建一個瞬時的Integer屬性,它是從你的字符串值中計算出來的。有關製作這種吸氣功能的信息,請參閱2pi.dk/tech/cocoa/transient_properties.html上的「更好的解決方案」。

+0

時間戳是自1970年以來的秒數。現在我覺得有點愚蠢,但是「添加瞬態屬性」是什麼意思? – sanna 2011-02-17 11:11:44