Realm 검색 조건에 QueryKit을 사용해보기

7912 단어 SwiftRealm
이 기사는 -스피카 Advent Calendar 2015 - 3일째의 기사입니다.

당사의 서비스 에서는 Realm 을 극찬 사용하고 있습니다만, 그 검색 조건 부분을 보다 Swift 같게 써 보자를 테마에 투고합니다.

소개



Realm에서는 통상, 이하의 filter 메소드에 캐릭터 라인으로 조건을 기술합니다만, 타이포등했을 경우는 런타임시에, 처음에 에러로서 나타납니다.

public func filter(predicateFormat: String, _ args: AnyObject...) -> Results<T>

이렇게하면 접는 각도 컴파일 언어로 Swift의 매력이 반감됩니다.
그래서 이번에는 QueryKit이라는 라이브러리를 조합하여 그러한 부분을 해소하려고 시도합니다.

QueryKit



QueryKit 자체는 CoreData 용 라이브러리이지만 CoreData, Realm 모두 NSPredicate 를 이용한 인터페이스이므로 Realm 에서도 이용할 수 있습니다.

QueryKit을 사용하면 NSPredicate가 다음과 같은 구문으로 표현됩니다.
// Name is equal to Kyle
name == "Kyle"

// Name is either equal to Kyle or Katie
name << ["Kyle", "Katie"]

// Age is equal to 27
age == 27

// Age is more than or equal to 25
age >= 25

// Age is within the range 22 to 30.
age << (22...30)

htps : // 기주 b. 코 m / 쿠 ry t / 쿠 ry t # 오페라와 rs

구체적인 예



정의 부분



다음과 같이 RealmSwift.Object 를 보통으로 상속한 클래스에 대해서, 필요에 따라서 Arrtibute< AttributeType> 형태의 클래스 변수를 정의합니다.

import RealmSwift

class Dog: Object {
    dynamic var name = ""
    dynamic var age = 0
}
class Person: Object {
    dynamic var name = ""
}


import QueryKit

extension Dog {
    static var name: Attribute<String> { return Attribute("name") }
    static var age: Attribute<Int> { return Attribute("age") }
}

extension Person {
    static var name: Attribute<String> { return Attribute("name") }
}


쿼리 부분



Realm에서 객체를 검색할 때는 다음과 같이 작성할 수 있습니다.
let realm = try! Realm()

// "name = %@", "Taro"
realm.objects(Dog).filter(Dog.name == "Taro")

// "name IN %@", ["Taro", "Jiro"]
realm.objects(Dog).filter(Dog.name << ["Taro", "Jiro"])

// "name = %@ AND age > %@", "Taro", 2
realm.objects(Dog).filter(Dog.name == "Taro" && Dog.age > 2)

장점


  • 문자열이 아니므로 입력 완성이 작동합니다. ✨
  • Generics를 사용하여 형식 일치도 결정되므로 다음과 같은 식은 컴파일시 오류가 발생합니다. ✨
  • realm.objects(Dog).filter(Dog.age > "2")
    
    // Binary operator '>' cannot be applied to operands of type 'Attribute<Int>' and 'String'
    

    결론



    달리기 시작했지만 Realm에 QueryKit을 결합한 예를 소개해 보았습니다 😎

     

    좋은 웹페이지 즐겨찾기