Search code examples
iosswiftrealm

NSData properties cannot be queried over an object link


I have model like this:

class Session: Object {
    dynamic var token: NSData?
}

class SessionsPool: Object {
    let sessions = List<Session>()
}

I can request all sessions (normally there is one or zero) with required token

let myToken: NSData = ...
let sessions = self.realm.objects(Session).filter("token == %@", myToken)

It works well.

And I would like to request all pools that has at least one session with required token. And I would like to "observe" this request for updates.

let myToken: NSData = ...
var pools = self.realm.objects(SessionsPool).filter("ANY sessions.token == %@", myToken)
pools.addNotificationBlock { (change) in
            // Some code
        }

But I can't do it due to error:

*** Terminating app due to uncaught exception 'Unsupported operator', 
reason: 'NSData properties cannot be queried over an object link.'

So I can use predicates like token == *someNSData* or like ANY sessions.stringToken == *someNSString*, but not like ANY sessions.token == *someNSData*.

What's wrong with NSData?


Solution

  • That particular query type hasn't been implemented yet: https://github.com/realm/realm-cocoa/issues/4222

    However, your query can be refactored to something that Realm does support:

    Replace this: ANY sessions.token == %@

    With this: SUBQUERY(sessions, $session, $session.token == %@).@count > 0