Realm 검색 조건에 QueryKit을 사용해보기
당사의 서비스 에서는 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)
장점
public func filter(predicateFormat: String, _ args: AnyObject...) -> Results<T>
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)
장점
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") }
}
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)
realm.objects(Dog).filter(Dog.age > "2")
// Binary operator '>' cannot be applied to operands of type 'Attribute<Int>' and 'String'
결론
달리기 시작했지만 Realm에 QueryKit을 결합한 예를 소개해 보았습니다 😎
Reference
이 문제에 관하여(Realm 검색 조건에 QueryKit을 사용해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sora0077@github/items/57e2fbee7fda6ed49901
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Realm 검색 조건에 QueryKit을 사용해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sora0077@github/items/57e2fbee7fda6ed49901텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)