2014-09-24 50 views
-1

我正在嘗試創建一個NSPredicateNSDate s來查詢我的核心數據db。我在一個方法中形成一個名爲filterStringNSMutableString的謂詞。 queryCount是一個NSInteger,用於跟蹤追加了多少個查詢。在下面的塊,startendNSDate小號NSPredicate with NSDate

if (start || end) 
    { 
     if (!queryCount) 
     { 
      [filterString appendString:@"("]; 
     } 
     else 
     { 
      [filterString appendString:@" && ("]; 
     } 

     // date range and exact date 
     if (start && end) 
     { 
      [filterString appendFormat:@"%@ >= %@ && %@ <= %@", kTransactionFilterDateKey, start, kTransactionFilterDateKey, end]; 
     } 
     // only start 
     else if (start && !end) 
     { 
      [filterString appendFormat:@"%@ >= %@ && %@ <= %@", kTransactionFilterDateKey, start, kTransactionFilterDateKey, [NSDate distantFuture]]; 
     } 
     // only end 
     else if (end && !start) 
     { 
      [filterString appendFormat:@"%@ >= %@ && %@ <= %@", kTransactionFilterDateKey, [NSDate distantPast], kTransactionFilterDateKey, end]; 
     } 

     [filterString appendString:@")"]; 

     queryCount++; 
    } 

當我到形成實際謂詞對象(self.currentFilterString是指其中上述塊是從方法)的塊:

​​

我收到錯誤"Unable to parse the format string "(date >= 2014-09-24 04:00:00 +0000 && date <= 4001-01-01 00:00:00 +0000)""

這是標記爲//only start的塊的結果。其他塊的結果相同。我試過使用不同的日期值而不是distantFuture,但是這也不會改變任何東西。

我也試過了一個變化,就像"%@ BETWEEN %@", kTransactionFilterDateKey, @[start, end],但這給了我同樣的錯誤。

這是一個NSPredicate使用日期的正確格式還是有不同的方法來做到這一點?我在網上找到的所有東西都讓我認爲我只是將NSDate對象放入格式化的字符串中,就像我在做的一樣。

+0

您可以嘗試的一件事是創建多個單獨的謂詞並設置複合謂詞:[NSCompoundPredicate andPredicateWithSubpredicates:@ [pred1,pred2]]; – mitrenegade 2014-09-24 21:33:14

回答

1

我想通了。比較日期時,NSPredicate對關鍵格式很挑剔。當我使用%K作爲鍵來手動創建謂詞時,將已格式化的字符串直接放入predicateWithFormat:而不是%@,而我已將其傳入該字符串中。所以我重寫了我的解決方案,創建一個帶有%K作爲關鍵佔位符的格式化字符串,並創建了一個我可以傳入的參數數組predicateWithFormat:arguments