문서 메뉴
문서 홈
/ /
Atlas Device SDK
/ /

데이터 필터링 - Swift SDK

이 페이지의 내용

  • 개요
  • 해당 페이지의 예제에 대한 정보
  • Realm Swift 쿼리 API
  • 연산자
  • 비교 연산자
  • 컬렉션
  • 로직 연산
  • 문자열 연산자
  • 지리 공간적 연산자
  • 집계 연산자
  • 집합 연산자
  • 하위 쿼리
  • NSPredicate 쿼리
  • 표현식
  • 점 표기법
  • 대체 항목
  • 연산자
  • 비교 연산자
  • 로직 연산
  • 문자열 연산자
  • 지리 공간적 연산자
  • 집계 연산자
  • 집합 연산자
  • 하위 쿼리

Realm의 데이터를 필터링하려면 Realm의 쿼리 엔진을 활용하면 됩니다.

버전 10.19.0의 새로운 기능:: Realm Swift 쿼리 API

Realm Swift 쿼리 API 는 Swift 개발자가 데이터를 쿼리할 수 있는 관용적인 방법을 제공합니다. Swift 스타일 구문을 사용하여 자동 완성 및 유형 안전성의 이점이 있는 영역을 쿼리합니다. Realm Swift 쿼리 API는 최신 SDK 버전에서 NSPredicate 쿼리 API를 대체하지 않습니다. 대신 둘 중 하나를 사용할 수 있습니다.

10.19.0 이전 SDK 버전 또는 Objective-C 개발자의 경우 Realm 의 쿼리 엔진은 NSPredicate 쿼리를 지원합니다.

이 페이지의 예제에서는 작업 목록 앱의 간단한 데이터 세트를 사용합니다. 두 가지 Realm 객체 유형은 ProjectTask 입니다. Task에는 이름, 담당자 이름 및 완료 플래그가 있습니다. 우선 순위를 뜻하는 임의 숫자(클수록 더 중요)와 작업에 소요된 시간(분)도 있습니다. 마지막으로 Task은(는) 문자열 labels 하나 이상과 정수 ratings하나 이상을 가질 수 있습니다.

Project에는 Tasks이(가) 0개 이상 있습니다.

아래에서 이 두 클래스의 스키마 ProjectTask를 참조하세요.

// Task.h
@interface Task : RLMObject
@property NSString *name;
@property bool isComplete;
@property NSString *assignee;
@property int priority;
@property int progressMinutes;
@end
RLM_COLLECTION_TYPE(Task)
// Task.m
@implementation Task
@end
// Project.h
@interface Project : RLMObject
@property NSString *name;
@property RLMArray<Task> *tasks;
@end
// Project.m
@implementation Project
@end
class Task: Object {
@Persisted var name = ""
@Persisted var isComplete = false
@Persisted var assignee: String?
@Persisted var priority = 0
@Persisted var progressMinutes = 0
@Persisted var labels: MutableSet<String>
@Persisted var ratings: MutableSet<Int>
}
class Project: Object {
@Persisted var name = ""
@Persisted var tasks: List<Task>
}

다음 코드를 사용하여 이러한 예시에 대한 Realm을 설정할 수 있습니다.

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^() {
// Add projects and tasks here
}];
RLMResults *tasks = [Task allObjectsInRealm:realm];
RLMResults *projects = [Project allObjectsInRealm:realm];
let realm = try! Realm()
try! realm.write {
// Add tasks and projects here.
let project = Project()
project.name = "New Project"
let task = Task()
task.assignee = "Alex"
task.priority = 5
project.tasks.append(task)
realm.add(project)
// ...
}
let tasks = realm.objects(Task.self)
let projects = realm.objects(Project.self)

버전 10 에 추가되었습니다.19.0: 10 이전 SDK 버전의 경우.19.0, NSPredicate 쿼리 API를 사용합니다.

.where Realm Swift 쿼리 API를 사용하여 Swift 스타일 구문으로 필터를 빌드할 수 있습니다.

let realmSwiftQuery = projects.where {
($0.tasks.progressMinutes > 1) && ($0.tasks.assignee == "Ali")
}

이 쿼리 API는 쿼리를 수행하기 위해 NSPredicate를 구성합니다. 개발자에게 직접 사용할 수 있는 형식이 안전한 관용적 API를 제공하고 NSprecate 구성을 추상화합니다.

.where API는 참 또는 거짓으로 평가되는 콜백을 받습니다. 콜백은 쿼리 중인 유형의 인스턴스를 수신하며 컴파일러를 활용하여 유효한 속성을 참고하는 유효한 쿼리를 생성하고 있는지 정적으로 확인할 수 있습니다.

이 페이지의 예제에서는 $0 축약형을 사용하여 콜백에 전달된 변수를 참고합니다.

Realm collection을 쿼리하는 데 사용할 수 있는 연산자에는 여러 유형이 있습니다. 쿼리는 쿼리 중인 컬렉션의 모든 객체에 대해 연산자 표현식을 평가하는 방식으로 작동합니다. 표현식이 true(으)로 확인되면 Realm 데이터베이스는 객체를 컬렉션에 포함합니다.

Swift 비교 연산자를 Realm Swift 쿼리 API(==, !=, >, >=, <, <=)와 함께 사용할 수 있습니다.

예제

다음 예제에서는 쿼리 엔진의 비교 연산자를 사용하여 다음 작업을 수행합니다.

  • priority 속성 값 중 우선 순위가 높은 것으로 간주되는 값을 임계값과 비교하여 우선순위가 작업을 찾습니다.

  • progressMinutes 속성이 특정 값 이상인지 확인하여 장기 작업 항목을 찾습니다.

  • 속성 assigneenull과 같은 작업을 찾아 할당되지 않은 작업을 찾습니다.

let highPriorityTasks = tasks.where {
$0.priority > 5
}
print("High-priority tasks: \(highPriorityTasks.count)")
let longRunningTasks = tasks.where {
$0.progressMinutes >= 120
}
print("Long running tasks: \(longRunningTasks.count)")
let unassignedTasks = tasks.where {
$0.assignee == nil
}
print("Unassigned tasks: \(unassignedTasks.count)")

.contains 연산자를 사용하여 컬렉션 내의 값을 쿼리할 수 있습니다. 요소별로 개별 값을 검색하거나 범위 내에서 검색할 수 있습니다.

연산자
설명
.in(_ collection:)
표현식에서 참고하는 속성에 지정된 배열의 요소가 포함되어 있는지 true(으)로 평가됩니다.
.contains(_ element:)
IN 연산자와 동일합니다. 표현식의 속성 참고 값에 값이 포함되어 있는지 true(으)로 평가됩니다.
.contains(_ range:)
BETWEEN 연산자와 동일합니다. 표현식에서 참고 속성에 범위 내의 값이 포함되어 있으면 true(으)로 평가됩니다.
.containsAny(in: )
ANY 연산자와 결합된 IN 연산자와 동일합니다. 지정된 배열에 포함된 요소가 컬렉션에 있는지 true(으)로 평가됩니다.

예제

  • labels MutableSet 컬렉션 속성에 '퀵 윈'이 포함된 작업을 찾습니다.

  • progressMinutes 속성이 지정된 분 범위 내에 있는 작업을 찾습니다.

let quickWinTasks = tasks.where {
$0.labels.contains("quick win")
}
print("Tasks labeled 'quick win': \(quickWinTasks.count)")
let progressBetween30and60 = tasks.where {
$0.progressMinutes.contains(30...60)
}
print("Tasks with progress between 30 and 60 minutes: \(progressBetween30and60.count)")

labels MutableSet 컬렉션 속성에 지정된 배열의 요소('퀵 윈' 또는 '버그')가 포함되어 있는 작업을 찾습니다.

let quickWinOrBugTasks = tasks.where {
$0.labels.containsAny(in: ["quick win", "bug"])
}
print("Tasks labeled 'quick win' or 'bug': \(quickWinOrBugTasks.count)")

버전 10.23.0의 새로운 기능:: IN 연산자

Realm Swift 쿼리 API는 이제 IN 연산자를 지원합니다. 표현식의 속성 참고 값에 값이 포함되어 있는지 true(으)로 평가됩니다.

예제

이름 목록에 assignee 속성이 있는지 확인하여 Ali 또는 Jamie라는 특정한 팀원에게 할당된 작업을 찾을 수 있습니다.

let taskAssigneeInAliOrJamie = tasks.where {
let assigneeNames = ["Ali", "Jamie"]
return $0.assignee.in(assigneeNames)
}
print("Tasks IN Ali or Jamie: \(taskAssigneeInAliOrJamie.count)")

Swift 논리 연산자(&&, !, ||)를 사용하여 복합 쿼리를 만들 수 있습니다.

예제

쿼리 언어의 논리 연산자를 사용하여 Ali가 완료한 모든 작업을 찾을 수 있습니다. 즉, assignee 속성 값이 'Ali'이고 isComplete 속성 값이 true인 모든 작업을 찾습니다.

let aliComplete = tasks.where {
($0.assignee == "Ali") && ($0.isComplete == true)
}
print("Ali's complete tasks: \(aliComplete.count)")

이러한 문자열 연산자를 사용하여 문자열 값을 비교할 수 있습니다. 정규식과 유사한 와일드카드를 사용하면 더욱 유연하게 검색할 수 있습니다.

참고

문자열 연산자와 함께 다음 옵션을 사용할 수 있습니다.

  • .caseInsensitive 대소문자를 구분하지 않도록

    $0.name.contains("f", options: .caseInsensitive)
  • .diacriticInsensitive 분음 부호를 구분하지 않으려면 Realm은 특수 문자를 기본 문자로 취급합니다. (예: é -> e)

    $0.name.contains("e", options: .diacriticInsensitive)
연산자
설명
.starts(with value: String)
컬렉션에 값이 지정된 문자열 값으로 시작하는 요소가 포함된 경우 true(으)로 평가됩니다.
.contains(_ value: String)
왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 어느 위치에서든 발견되면 true로 평가합니다.
.ends(with value: String)
컬렉션에 값이 지정된 문자열 값으로 끝나는 요소가 포함된 경우 true(으)로 평가됩니다.
.like(_ value: String)

왼쪽 문자열 표현식이 오른쪽 문자열 와일드카드 문자열 표현식과 일치하는 경우 true(으)로 평가합니다. 와일드카드 문자열 표현식은 일반 문자를 두 개의 특수 와일드카드 문자와 함께 사용하는 문자열입니다.

  • * 와일드카드는 0개 또는 그 이상의 어느 문자와든 일치합니다.

  • ? 와일드카드는 어느 문자와든 일치합니다.

예를 들어 와일드카드 문자열 'd?g'는 'dog', 'dig', 'dug'과 일치되지만 'ding', 'dg' 또는 'a dog'와는 일치되지 않습니다.

==
왼쪽 문자열이 오른쪽 문자열과 사전순으로 동일한 경우 true(으)로 평가합니다.
!=
왼쪽 문자열이 오른쪽 문자열과 사전 순으로 같지 않은 경우 true(으)로 평가합니다.

예제

다음 예제에서는 쿼리 엔진의 문자열 연산자를 사용하여 다음을 찾습니다.

  • 이름의 첫 글자가 'e'인 프로젝트

  • 이름에 'ie'가 포함된 프로젝트

  • 값이 Al?x(와)과 유사한 assignee 속성을 가진 프로젝트입니다.

  • 분음 부호를 구분하지 않는 e와 유사한 문자가 포함된 프로젝트

// Use the .caseInsensitive option for case-insensitivity.
let startWithE = projects.where {
$0.name.starts(with: "e", options: .caseInsensitive)
}
print("Projects that start with 'e': \(startWithE.count)")
let containIe = projects.where {
$0.name.contains("ie")
}
print("Projects that contain 'ie': \(containIe.count)")
let likeWildcard = tasks.where {
$0.assignee.like("Al?x")
}
print("Tasks with assignees like Al?x: \(likeWildcard.count)")
// Use the .diacreticInsensitive option for diacritic insensitivty: contains 'e', 'E', 'é', etc.
let containElike = projects.where {
$0.name.contains("e", options: .diacriticInsensitive)
}
print("Projects that contain 'e', 'E', 'é', etc.: \(containElike.count)")

참고

문자열 정렬 및 대소문자를 구분하지 않는 퀴리는 'Latin Basic', 'Latin Supplement', 'Latin Extended A', 'Latin Extended B'(UTF-8 범위 0-591)의 문자에 대해서만 지원합니다.

버전 10.47.0에 새로 추가되었습니다.

geoWithin 연산자를 사용하여 SDK에서 제공하는 도형 중 하나로 지리 공간적 데이터를 쿼리할 수 있습니다.

  • GeoCircle

  • GeoBox

  • GeoPolygon

이 연산자는 다음과 같은 경우 true로 평가됩니다.

  • 객체에는 점 값이 있는 String 속성을 포함하는 지리 공간적 데이터 "도형"과 경도/위도 쌍을 포함하는 List가 있습니다.

  • 지속형 객체의 경도/위도는 지리 공간적 쿼리 도형에 속합니다.

let companiesInSmallCircle = realm.objects(Geospatial_Company.self).where {
$0.location.geoWithin(smallCircle!)
}
print("Number of companies in small circle: \(companiesInSmallCircle.count)")

지리 공간적 데이터 쿼리에 대한 자세한 내용은 지리 공간적 데이터 쿼리를 참조하세요.

Realm 객체의 컬렉션 속성에 애그리게이션 연산자를 적용할 수 있습니다. 애그리게이션 연산자는 컬렉션을 순회하여 이를 하나의 값으로 줄입니다.

연산자
설명
.avg
컬렉션 전체에서 주어진 숫자 속성의 평균값으로 평가합니다.
.count
주어진 컬렉션의 객체 수로 평가합니다. 현재 이 기능은 다대다 컬렉션에서만 지원되며 기본 요소 목록에서는 지원되지 않습니다. 기본 요소 목록에서 .count을(를) 사용하려면 Realm 객체에 기본 요소를 래핑하는 것을 고려하세요.
.max
컬렉션 전체에서 주어진 숫자 속성의 가장 높은 값을 평가합니다.
.min
컬렉션 전체에서 주어진 숫자 속성의 가장 낮은 값으로 평가합니다.
.sum
컬렉션 전체에서 주어진 숫자 속성의 합계로 평가합니다.

예제

데이터의 다양한 측면을 나타내는 몇 가지 필터를 생성합니다.

  • 작업 우선 순위의 평균이 5보다 높은 프로젝트

  • 우선 순위가 5 미만인 작업만 포함된 프로젝트입니다.

  • 모든 작업의 우선순위가 5 이상으로 높은 프로젝트입니다.

  • 작업이 5개 이상 포함된 프로젝트입니다.

  • 장기 실행 프로젝트

let averageTaskPriorityAbove5 = projects.where {
$0.tasks.priority.avg > 5
}
print("Projects with average task priority above 5: \(averageTaskPriorityAbove5.count)")
let allTasksLowerPriority = projects.where {
$0.tasks.priority.max < 5
}
print("Projects where all tasks are lower priority: \(allTasksLowerPriority.count)")
let allTasksHighPriority = projects.where {
$0.tasks.priority.min > 5
}
print("Projects where all tasks are high priority: \(allTasksHighPriority.count)")
let moreThan5Tasks = projects.where {
$0.tasks.count > 5
}
print("Projects with more than 5 tasks: \(moreThan5Tasks.count)")
let longRunningProjects = projects.where {
$0.tasks.progressMinutes.sum > 100
}
print("Long running projects: \(longRunningProjects.count)")

설정 연산자는 특정 규칙을 사용하여 객체의 지정된 목록 속성의 모든 요소에 지정된 쿼리 표현식을 적용하여 각 입력 컬렉션 객체를 출력 컬렉션으로 전달할지 여부를 결정합니다.

예제

projects 컬렉션에서 다음 쿼리를 실행하면 다음이 반환됩니다.

  • labels 문자열 세트에 '퀵 윈', '버그' 중 하나가 포함된 프로젝트입니다.

  • ratings 정수 세트의 요소가 3보다 큰 프로젝트입니다.

let projectsWithGivenLabels = projects.where {
$0.tasks.labels.containsAny(in: ["quick win", "bug"])
}
print("Projects with quick wins: \(projectsWithGivenLabels.count)")
let projectsWithRatingsOver3 = projects.where {
$0.tasks.ratings > 3
}
print("Projects with any ratings over 3: \(projectsWithRatingsOver3.count)")

하위 쿼리를 사용하여 다른 쿼리로 컬렉션 속성을 반복할 수 있습니다. 하위 쿼리를 구성하려면 표현식을 괄호로 묶고 바로 뒤에 .count 수집기가 와야 합니다.

(<query>).count > n

표현식이 유효한 하위 쿼리를 생성하지 않으면 런타임 시 예외가 발생합니다.

예제

projects 컬렉션에서 다음 쿼리를 실행하면 Alex라는 사용자가 완료하지 않은 작업이 포함된 프로젝트가 반환됩니다.

let subquery = projects.where {
($0.tasks.isComplete == false && $0.tasks.assignee == "Alex").count > 0
}
print("Projects with incomplete tasks assigned to Alex: \(subquery.count)")

NSPredicate를 사용하여 필터를 작성할 수 있습니다.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"progressMinutes > %@ AND name == %@", @1, @"Ali"];
let predicate = NSPredicate(format: "progressMinutes > 1 AND name == %@", "Ali")

필터는 NSPredicate의 표현식으로 구성됩니다. 표현식은 다음 중 하나로 구성됩니다.

  • 현재 평가 중인 객체의 속성 이름(키 경로)입니다.

  • 연산자와 최대 2개의 인수 표현식입니다.

  • 값으로는 문자열('hello') 또는 숫자(5) 등이 있습니다.

객체 속성을 참조할 때 점 표기법을 사용하여 해당 객체의 하위 속성을 참조할 수 있습니다. 점 표기법을 사용하여 포함된 객체 속성과 관계를 참조할 수도 있습니다.

그 예로 어떤 쿼리는 Workplace 객체를 참조하는 workplace 속성을 가진 객체를 대상으로 합니다. Workplace 객체에는 포함된 객체 속성인 address이(가) 있습니다. 해당 주소의 우편번호 속성을 참조하기 위해 점 표기법을 연결할 수 있습니다.

workplace.address.zipcode == 10012

술어 형식 문자열에 다음과 같은 대체어를 사용할 수 있습니다:

[NSPredicate predicateWithFormat:@"%K > %@ AND %K == %@", @"progressMinutes", @1, @"name", @"Ali"];
NSPredicate(format: "%K > %@ AND %K == %@", "progressMinutes", NSNumber(1), "name", "Ali")

Realm 컬렉션을 필터링할 때 사용할 수 있는 연산자에는 여러 가지 유형이 있습니다. 필터는 필터링 대상 컬렉션의 모든 객체에 대한 연산자 표현식을 평가함으로써 작동합니다. 표현식이 true(으)로 확인되면 Realm 데이터베이스의 결과 컬렉션에 해당 객체가 포함됩니다.

검색에서 가장 간단한 작업은 값을 비교하는 것입니다.

중요

유형이 일치해야 함

연산자의 양쪽에 있는 형식은 동일해야 합니다. 예를 들어 객체 ID를 문자열과 비교하면 다음과 같은 메시지와 함께 전제 조건 실패가 발생합니다.

"Expected object of type object id for property 'id' on object of type
'User', but received: 11223344556677889900aabb (Invalid value)"

모든 숫자 유형을 다른 숫자 유형과 비교할 수 있습니다.

연산자
설명
between
왼쪽 숫자 또는 날짜 표현식이 오른쪽 범위 사이에 있거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜 범위 내에 있으면 true(으)로 평가합니다.
==, =
왼쪽 표현식이 오른쪽 표현식과 같은 경우 true(으)로 평가합니다.
>
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦으면 true(으)로 평가합니다.
>=
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦거나 같으면 true(으)로 평가합니다.
in
왼쪽 표현식이 오른쪽 목록이나 문자열에 있으면 true(으)로 평가됩니다.
<
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 작으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르면 true(으)로 평가합니다.
<=
왼쪽 숫자 표현식이 오른쪽 숫자 표현식보다 작거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르거나 같으면 true(으)로 평가합니다.
!=, <>
왼쪽 표현식이 오른쪽 표현식과 같지 않은 경우 true(으)로 평가합니다.

예제

다음 예제에서는 쿼리 엔진의 비교 연산자를 사용하여 다음 작업을 수행합니다.

  • priority 속성 값 중 우선 순위가 높은 것으로 간주되는 값을 임계값과 비교하여 우선순위가 작업을 찾습니다.

  • progressMinutes 속성이 특정 값 이상인지 확인하여 장기 작업 항목을 찾습니다.

  • 속성 assigneenull과 같은 작업을 찾아 할당되지 않은 작업을 찾습니다.

  • 이름 목록에 assignee 속성이 있는지 확인하여 Ali 또는 Jamie라는 특정한 팀원에게 할당된 작업을 찾을 수 있습니다.

NSLog(@"High priority tasks: %lu",
[[tasks objectsWithPredicate:[NSPredicate predicateWithFormat:@"priority > %@", @5]] count]);
NSLog(@"Short running tasks: %lu",
[[tasks objectsWhere:@"progressMinutes between {1, 15}"] count]);
NSLog(@"Unassigned tasks: %lu",
[[tasks objectsWhere:@"assignee == nil"] count]);
NSLog(@"Ali or Jamie's tasks: %lu",
[[tasks objectsWhere:@"assignee IN {'Ali', 'Jamie'}"] count]);
NSLog(@"Tasks with progress between 30 and 60 minutes: %lu",
[[tasks objectsWhere:@"progressMinutes BETWEEN {30, 60}"] count]);
let highPriorityTasks = tasks.filter("priority > 5")
print("High priority tasks: \(highPriorityTasks.count)")
let longRunningTasks = tasks.filter("progressMinutes > 120")
print("Long running tasks: \(longRunningTasks.count)")
let unassignedTasks = tasks.filter("assignee == nil")
print("Unassigned tasks: \(unassignedTasks.count)")
let aliOrJamiesTasks = tasks.filter("assignee IN {'Ali', 'Jamie'}")
print("Ali or Jamie's tasks: \(aliOrJamiesTasks.count)")
let progressBetween30and60 = tasks.filter("progressMinutes BETWEEN {30, 60}")
print("Tasks with progress between 30 and 60 minutes: \(progressBetween30and60.count)")

논리 연산자를 사용하여 복합 조건자를 작성할 수 있습니다.

연산자
설명
and
&&
왼쪽 및 오른쪽 표현식이 모두 true인 경우 true(으)로 평가합니다.
not
!
주어진 표현식의 결과를 무효화합니다.
or
||
두 표현식 중 하나가 true를 반환하면 true(으)로 평가합니다.

예제

쿼리 언어의 논리 연산자를 사용하여 Ali가 완료한 모든 작업을 찾을 수 있습니다. 즉, assignee 속성 값이 'Ali'이고 isComplete 속성 값이 true인 모든 작업을 찾습니다.

NSLog(@"Ali's complete tasks: %lu",
[[tasks objectsWhere:@"assignee == 'Ali' AND isComplete == true"] count]);
let aliComplete = tasks.filter("assignee == 'Ali' AND isComplete == true")
print("Ali's complete tasks: \(aliComplete.count)")

이러한 문자열 연산자를 사용하여 문자열 값을 비교할 수 있습니다. 정규식과 유사한 와일드카드를 사용하면 더욱 유연하게 검색할 수 있습니다.

참고

해당 문자열 연산자와 함께 사용할 수 있는 수정자는 다음과 같습니다.

  • [c] 대소문자를 구분하지 않도록

    [NSPredicate predicateWithFormat: @"name CONTAINS[c] 'f'"]
    NSPredicate(format: "name CONTAINS[c] 'f'")
  • [d] 분음 부호를 구분하지 않으려면 Realm은 특수 문자를 기본 문자로 취급합니다. (예: é -> e)

    [NSPredicate predicateWithFormat: @"name CONTAINS[d] 'e'"]
    NSPredicate(format: "name CONTAINS[d] 'e'")
연산자
설명
beginsWith
왼쪽 문자열 표현식이 오른쪽 문자열 표현식으로 시작하면 true(으)로 평가합니다. 이는 contains와(과) 비슷하지만, 오른쪽 문자열 표현식이 왼쪽 문자열 표현식의 시작 부분에 있는 경우에만 일치합니다.
contains, in
왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 어느 위치에서든 발견되면 true로 평가합니다.
endsWith
왼쪽 문자열 표현식이 오른쪽 문자열 표현식으로 끝나는 경우 true(으)로 평가합니다. 이는 contains와(과) 비슷하지만 왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 끝에 있는 경우에만 일치됩니다.
like

왼쪽 문자열 표현식이 오른쪽 문자열 와일드카드 문자열 표현식과 일치하는 경우 true(으)로 평가합니다. 와일드카드 문자열 표현식은 일반 문자를 두 개의 특수 와일드카드 문자와 함께 사용하는 문자열입니다.

  • * 와일드카드는 0개 또는 그 이상의 어느 문자와든 일치합니다.

  • ? 와일드카드는 어느 문자와든 일치합니다.

예를 들어 와일드카드 문자열 'd?g'는 'dog', 'dig', 'dug'과 일치되지만 'ding', 'dg' 또는 'a dog'와는 일치되지 않습니다.

==, =
왼쪽 문자열이 오른쪽 문자열과 사전순으로 동일한 경우 true(으)로 평가합니다.
!=, <>
왼쪽 문자열이 오른쪽 문자열과 사전 순으로 같지 않은 경우 true(으)로 평가합니다.

예제

쿼리 엔진의 문자열 연산자를 사용하여 이름의 첫 글자가 'e'인 프로젝트와 이름에 'ie'가 포함된 프로젝트를 찾습니다.

// Use [c] for case-insensitivity.
NSLog(@"Projects that start with 'e': %lu",
[[projects objectsWhere:@"name BEGINSWITH[c] 'e'"] count]);
NSLog(@"Projects that contain 'ie': %lu",
[[projects objectsWhere:@"name CONTAINS 'ie'"] count]);
// Use [c] for case-insensitivity.
let startWithE = projects.filter("name BEGINSWITH[c] 'e'")
print("Projects that start with 'e': \(startWithE.count)")
let containIe = projects.filter("name CONTAINS 'ie'")
print("Projects that contain 'ie': \(containIe.count)")
// [d] for diacritic insensitivty: contains 'e', 'E', 'é', etc.
let containElike = projects.filter("name CONTAINS[cd] 'e'")
print("Projects that contain 'e', 'E', 'é', etc.: \(containElike.count)")

참고

문자열 정렬 및 대소문자를 구분하지 않는 퀴리는 'Latin Basic', 'Latin Supplement', 'Latin Extended A', 'Latin Extended B'(UTF-8 범위 0-591)의 문자에 대해서만 지원합니다.

버전 10.47.0에 새로 추가되었습니다.

SDK에서 제공하는 도형 중 하나와 함께 IN 연산자를 사용하여 지리 공간적 쿼리를 수행할 수 있습니다.

  • GeoCircle

  • GeoBox

  • GeoPolygon

이 연산자는 다음과 같은 경우 true로 평가됩니다.

  • 객체에는 점 값이 있는 String 속성을 포함하는 지리 공간적 데이터 "도형"과 경도/위도 쌍을 포함하는 List가 있습니다.

  • 지속형 객체의 경도/위도는 지리 공간적 쿼리 도형에 속합니다.

let filterArguments = NSMutableArray()
filterArguments.add(largeBox)
let companiesInLargeBox = realm.objects(Geospatial_Company.self)
.filter(NSPredicate(format: "location IN %@", argumentArray: filterArguments as? [Any]))
print("Number of companies in large box: \(companiesInLargeBox.count)")

지리 공간적 데이터 쿼리에 대한 자세한 내용은 지리 공간적 데이터 쿼리를 참조하세요.

Realm 객체의 컬렉션 속성에 애그리게이션 연산자를 적용할 수 있습니다. 애그리게이션 연산자는 컬렉션을 순회하여 이를 하나의 값으로 줄입니다.

연산자
설명
@avg
컬렉션 전체에서 주어진 숫자 속성의 평균값으로 평가합니다.
@count
주어진 컬렉션의 객체 수로 평가합니다. 현재 이 기능은 다대다 컬렉션에서만 지원되며 기본 요소 목록에서는 지원되지 않습니다. 기본 요소 목록에서 @count을(를) 사용하려면 Realm 객체에 기본 요소를 래핑하는 것을 고려하세요.
@max
컬렉션 전체에서 주어진 숫자 속성의 가장 높은 값을 평가합니다.
@min
컬렉션 전체에서 주어진 숫자 속성의 가장 낮은 값으로 평가합니다.
@sum
컬렉션 전체에서 주어진 숫자 속성의 합계로 평가합니다.

예제

데이터의 다양한 측면을 나타내는 몇 가지 필터를 생성합니다.

  • 작업 우선 순위의 평균이 5보다 높은 프로젝트

  • 장기 실행 프로젝트

NSLog(@"Projects with average tasks priority above 5: %lu",
[[projects objectsWhere:@"tasks.@avg.priority > 5"] count]);
NSLog(@"Projects where all tasks are lower priority: %lu",
[[projects objectsWhere:@"tasks.@max.priority < 5"] count]);
NSLog(@"Projects where all tasks are high priority: %lu",
[[projects objectsWhere:@"tasks.@min.priority > 5"] count]);
NSLog(@"Projects with more than 5 tasks: %lu",
[[projects objectsWhere:@"tasks.@count > 5"] count]);
NSLog(@"Long running projects: %lu",
[[projects objectsWhere:@"tasks.@sum.progressMinutes > 100"] count]);
let averageTaskPriorityAbove5 = projects.filter("tasks.@avg.priority > 5")
print("Projects with average task priority above 5: \(averageTaskPriorityAbove5.count)")
let allTasksLowerPriority = projects.filter("tasks.@max.priority < 5")
print("Projects where all tasks are lower priority: \(allTasksLowerPriority.count)")
let allTasksHighPriority = projects.filter("tasks.@min.priority > 5")
print("Projects where all tasks are high priority: \(allTasksHighPriority.count)")
let moreThan5Tasks = projects.filter("tasks.@count > 5")
print("Projects with more than 5 tasks: \(moreThan5Tasks.count)")
let longRunningProjects = projects.filter("tasks.@sum.progressMinutes > 100")
print("Long running projects: \(longRunningProjects.count)")

설정 연산자는 특정 규칙을 사용하여 객체의 지정된 목록 속성의 모든 요소에 지정된 술어를 적용하여 각 입력 컬렉션 객체를 출력 컬렉션으로 전달할지 여부를 결정합니다.

연산자
설명
ALL
컬렉션의 모든 객체에 대해 조건자가 true(으)로 평가하는 객체를 반환합니다.
ANY, SOME
컬렉션의 임의 객체에 대해 조건자가 true(으)로 평가하는 객체를 반환합니다.
NONE
컬렉션의 모든 객체에 대해 조건자가 false로 평가되는 객체를 반환합니다.

예제

쿼리 엔진의 설정 연산자를 사용하여 다음을 찾습니다.

  • 완료된 작업이 없는 프로젝트입니다.

  • 최우선 순위 작업이 있는 프로젝트입니다.

NSLog(@"Projects with no complete tasks: %lu",
[[projects objectsWhere:@"NONE tasks.isComplete == true"] count]);
NSLog(@"Projects with any top priority tasks: %lu",
[[projects objectsWhere:@"ANY tasks.priority == 10"] count]);
let noCompleteTasks = projects.filter("NONE tasks.isComplete == true")
print("Projects with no complete tasks: \(noCompleteTasks.count)")
let anyTopPriorityTasks = projects.filter("ANY tasks.priority == 10")
print("Projects with any top priority tasks: \(anyTopPriorityTasks.count)")

SUBQUERY() 조건자 함수를 사용하여 다른 쿼리로 컬렉션 속성을 반복할 수 있습니다. SUBQUERY()의 서명은 다음과 같습니다.

SUBQUERY(<collection>, <variableName>, <predicate>)
  • collection: 반복할 목록 속성의 이름

  • variableName: 하위 쿼리에 사용할 현재 요소의 변수 이름

  • predicate: 하위 쿼리 조건자를 포함하는 문자열 variableName(으)로 지정된 변수 이름을 사용하여 현재 반복되는 요소를 참조할 수 있습니다.

예제

projects 컬렉션에서 다음 필터를 실행하면 Alex라는 사용자가 완료하지 않은 작업이 포함된 프로젝트가 반환됩니다.

NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"SUBQUERY(tasks, $task, $task.isComplete == %@ AND $task.assignee == %@).@count > 0",
@NO,
@"Alex"];
NSLog(@"Projects with incomplete tasks assigned to Alex: %lu",
[[projects objectsWithPredicate:predicate] count]);
let predicate = NSPredicate(
format: "SUBQUERY(tasks, $task, $task.isComplete == false AND $task.assignee == %@).@count > 0", "Alex")
print("Projects with incomplete tasks assigned to Alex: \(projects.filter(predicate).count)")

돌아가기

스레딩

다음

변경 사항에 대한 반응