2015-05-29 24 views
2

我有使用NSPredicate這需要正則表達式匹配路徑查詢:如何在NSPredicate中重現MATCHES以查詢Realm?

let predicate = NSPredicate(format: "path MATCHES '/test/([^/]*[^/])$'") 

相匹配的文件夾測試裏面的一切,但不包括文件夾的所有子文件夾中測試,像這樣:

  1. /test/abc - >
  2. /test/abc/def - >

的問題是,我不能在Realm.io使用NSPredicateMATCH關鍵字。我怎樣才能重現這個查詢,所以它在Realm中工作?

添加例外的完整性:

從這裏境界

*** Terminating app due to uncaught exception 'Invalid operator type', reason: 'Operator type 6 not supported for string type'

回答

1

所以現在我已經解決了這樣的問題(修改模型,這是我想避免):

  1. 我只路徑存儲到父母,而不是完整的名字。名稱被存儲在不同的字段中(以獲得完整路徑,我將兩個字符串拼接在一起)
  2. 替代匹配正則表達式,我使用NSPredicate(format: "path ==[c] %@", "/test/")來獲取文件夾內容測試

爲什麼我不完全同意這個解決方案開心:

我想避免分離領域FULLPATH分爲兩個區域,因爲當文件被改名+感動,這只是一個操作 - 重寫fullPath在數據庫中。這可能看起來像一個小問題,但只有一個責任地點給了它更多的健壯性,因爲文件在應用程序環境中始終被移動和重命名。

0

喬。目前正則表達式在MATCH的Realm查詢中不受支持,您將需要手動執行此操作。我會構建一個NSArray並在其上使用過濾器謂詞。我們都知道這一點,並跟蹤所有不支持的謂詞here

+0

嗨喬,謝謝你的時間。不過,我可以在https://github.com/realm/realm-cocoa/blob/master/Realm/RLMQueryUtil.mm lines ** 685-706 **中獲得這些信息。我希望你能知道一些解決方法。 – Michal

+0

通過更改模型解決了問題。提議的NSArray過濾是不可接受的 - 在大量子文件夾和文件的情況下,當列出根文件夾的內容時,我實際上在整個結構中循環兩次。密切關注**#1490 ** :-) – Michal

+0

很高興聽到您找到了更好的替代解決方案!感謝您的耐心,因爲我們繼續增加對查詢的支持 – yoshyosh