2017-09-22 27 views
0

目前我有Transaction對象其中有一個transactionDate如何在域中使用<或<=運算符搜索對象?

class Transaction: Object { 
@objc dynamic var transactionDate: String = "" // yyyy-MM-dd 
} 

我有很多的這些對象,而我只需要刪除舊的(即多於兩個歲),所以我寫道:

// Since now is 2017-09 I need to delete all objects before 2015-09 
// calculations are out of scope here I think :) 
realm.objects(Transaction.self).filter("transactionDate < '2015-09-30'") 

不過,我得到一個例外:

無效的操作類型「原因是:‘運營商’<」不支持字符串類型。

它我不能使用<運算符的字符串。如何搜索 這些舊字符串? (所以我可以刪除它們)

+1

作爲字符串存儲日期是不好的做法,很難計算,爲什麼不存儲'NSDate'或時間戳? – Tj3n

+0

起初,我使用它們作爲NSDates存儲,但我意識到我從來沒有使用它們作爲日期。我一直在將我的nsdates對象轉換爲ui的字符串。我從服務器收到的格式完全滿足我的需求,所以我決定讓它們保持原樣。 – nacho4d

回答

0

您不能使用<作爲字符串。可能更好的方法是使用Collectionfilter方法。你可以通過閉包傳遞一個條件,然後你可以將字符串對象轉換爲Date對象。如下所示:

let formatter = DateFormatter() 
formatter.calendar = Calendar(identifier: .gregorian) 
formatter.dateFormat = "yyyy-MM-dd" 

let filtered = realm.objects(Transaction.self) 
    .filter { formatter.date(from: $0.transactionDate)! < formatter.date(from: "2015-09-30")! } 

缺點:它不使用Realm的原生查詢,所以Realm的延遲加載不起作用。但這不是一個問題,因爲我認爲這個過程不會被多次調用。

+0

吉川先生感謝您的快速回復。我懂了。我需要在啓動時調用它:(我希望這樣不會影響啓動時間,我會試試這個! – nacho4d

+0

是否可以在域中實現字符串的'<'運算符?在這種情況下,字面比較'「2017- 09-01「<」2017-08-31「'正是我所需要的 – nacho4d

+0

儘管這不是不可能的......但是最終你需要編寫與我共享的代碼,因爲比較」2017-09-01「和「2017-08-31」按日期順序,您需要將字符串轉換爲日期。 –