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

데이터 필터링 - Java SDK

이 페이지의 내용

  • 쿼리 엔진
  • 유창한 인터페이스
  • 이 섹션의 예시 정보
  • 비교 연산자
  • 로직 연산
  • 문자열 연산자
  • 집계 연산자
  • 필터, 정렬, 제한, 고유 및 체인 쿼리
  • 이 섹션의 예시 정보
  • 필터
  • 결과 정렬
  • 결과 제한
  • 고유 결과
  • 체인 쿼리
  • RQL을 사용한 쿼리

영역의 데이터를 필터링하려면 Realm 쿼리 엔진을 사용하세요.

Java SDK로 쿼리 엔진에 액세스하는 방법에는 두 가지가 있습니다.

  • 플루언트 인터페이스

  • Realm Query Language

Java SDK는 Fluent 인터페이스를 사용합니다. 쿼리 엔진에 전달되는 다중 절 쿼리를 구성합니다.

사용 가능한 메서드 전체 목록은 RealmQuery API를 참조하세요.

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

표현식은 다음 중 한 가지로 구성되어 있습니다.

  • 현재 평가 중인 객체의 속성 이름입니다.

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

  • 리터럴 문자열, 숫자 또는 날짜

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

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

ProjectTask.java
import org.bson.types.ObjectId;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;
import io.realm.annotations.Required;
public class ProjectTask extends RealmObject {
@PrimaryKey
public ObjectId _id;
@Required
public String name;
public String assignee;
public int progressMinutes;
public boolean isComplete;
public int priority;
@Required
public String _partition;
}
Project.java
import org.bson.types.ObjectId;
import io.realm.RealmList;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;
import io.realm.annotations.Required;
public class Project extends RealmObject {
@PrimaryKey
public ObjectId _id;
@Required
public String name;
public RealmList<ProjectTask> tasks = new RealmList<>();
}
ProjectTask.kt
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required
import org.bson.types.ObjectId
open class ProjectTask(
@PrimaryKey
var _id: ObjectId = ObjectId(),
@Required
var name: String = "",
var assignee: String? = null,
var progressMinutes: Int = 0,
var isComplete: Boolean = false,
var priority: Int = 0,
var _partition: String = ""
): RealmObject()
Project.kt
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required
import org.bson.types.ObjectId
open class Project(
@PrimaryKey
var _id: ObjectId = ObjectId(),
@Required
var name: String = "",
var tasks: RealmList<ProjectTask> = RealmList(),
): RealmObject()

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

연산자
설명
between
왼쪽 숫자 또는 날짜 표현식이 오른쪽 범위 사이에 있거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜 범위 내에 있으면 true(으)로 평가합니다.
equalTo
왼쪽 표현식이 오른쪽 표현식과 같은 경우 true(으)로 평가합니다.
greaterThan
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦으면 true(으)로 평가합니다.
greaterThanOrEqualTo
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦거나 같으면 true(으)로 평가합니다.
in
왼쪽 표현식이 오른쪽 목록에 있는 경우 true로 평가합니다.
lessThan
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 작으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르면 true(으)로 평가합니다.
lessThanOrEqualTo
왼쪽 숫자 표현식이 오른쪽 숫자 표현식보다 작거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르거나 같으면 true(으)로 평가합니다.
notEqualTo
왼쪽 표현식이 오른쪽 표현식과 같지 않은 경우 true(으)로 평가합니다.

예제

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

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

  • progressMinutes 속성이 특정 범위 내에 속하는지 확인하여 방금 시작한 작업이나 단기 실행 작업을 찾습니다.

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

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

RealmQuery<ProjectTask> tasksQuery = realm.where(ProjectTask.class);
Log.i("EXAMPLE", "High priority tasks: " + tasksQuery.greaterThan("priority", 5).count());
Log.i("EXAMPLE", "Just-started or short tasks: " + tasksQuery.between("progressMinutes", 1, 10).count());
Log.i("EXAMPLE", "Unassigned tasks: " + tasksQuery.isNull("assignee").count());
Log.i("EXAMPLE", "Ali or Jamie's tasks: " + tasksQuery.in("assignee", new String[]{"Ali", "Jamie"}).count());
val tasksQuery = realm.where(ProjectTask::class.java)
Log.i("EXAMPLE", "High priority tasks: " + tasksQuery.greaterThan("priority", 5).count())
Log.i("EXAMPLE", "Just-started or short tasks: " + tasksQuery.between("progressMinutes", 1, 10).count())
Log.i("EXAMPLE", "Unassigned tasks: " + tasksQuery.isNull("assignee").count())
Log.i("EXAMPLE", "Ali or Jamie's tasks: " + tasksQuery.`in`("assignee", arrayOf("Ali", "Jamie")).count())

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

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

예제

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

RealmQuery<ProjectTask> tasksQuery = realm.where(ProjectTask.class);
Log.i("EXAMPLE", "Ali has completed " +
tasksQuery.equalTo("assignee", "Ali").and().equalTo("isComplete", true).findAll().size() +
" tasks.");
val tasksQuery = realm.where(ProjectTask::class.java)
Log.i("EXAMPLE", "Ali has completed " +
tasksQuery.equalTo("assignee", "Ali").and()
.equalTo("isComplete", true).findAll().size + " tasks.")

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

연산자
설명
beginsWith
왼쪽 문자열 표현식이 오른쪽 문자열 표현식으로 시작하면 true로 평가합니다. 이는 contains와 비슷하지만 왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 끝에 있는 경우에만 일치됩니다.
contains
왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 어느 위치에서든 발견되면 true로 평가합니다.
endsWith
왼쪽 문자열 표현식이 오른쪽 문자열 표현식으로 끝나는 경우 true(으)로 평가합니다. 이는 contains와(과) 비슷하지만 왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 끝에 있는 경우에만 일치됩니다.
like

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

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

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

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

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

예제

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

RealmQuery<Project> projectsQuery = realm.where(Project.class);
// Pass Case.INSENSITIVE as the third argument for case insensitivity.
Log.i("EXAMPLE", "Projects that start with 'e': "
+ projectsQuery.beginsWith("name", "e", Case.INSENSITIVE).count());
Log.i("EXAMPLE", "Projects that contain 'ie': "
+ projectsQuery.contains("name", "ie").count());
val projectsQuery = realm.where(Project::class.java)
// Pass Case.INSENSITIVE as the third argument for case insensitivity.
Log.i("EXAMPLE", "Projects that start with 'e': "
+ projectsQuery.beginsWith("name", "e", Case.INSENSITIVE).count())
Log.i("EXAMPLE", "Projects that contain 'ie': "
+ projectsQuery.contains("name", "ie").count())

참고

대소문자를 구분하지 않는 문자 제한

대소문자를 구분하지 않는 문자열 연산자는 Latin Basic, Latin Supplement, Latin Extended A, Latin Extended B (UTF-8 range 0–591) 문자 세트만 지원합니다. equalTo, notEqualTo, contains, endsWith, beginsWith 또는 like를 사용할 때 쿼리에서 대소문자를 구분하지 않는 플래그를 설정하는 것은 영어 로캘 문자에서만 작동합니다.

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

연산자
설명
average
컬렉션 전체에서 주어진 숫자 속성의 평균값으로 평가합니다.
count
주어진 컬렉션의 객체 수로 평가합니다.
max
컬렉션 전체에서 주어진 숫자 속성의 가장 높은 값을 평가합니다.
min
컬렉션 전체에서 주어진 숫자 속성의 가장 낮은 값으로 평가합니다.
sum
컬렉션 전체에서 주어진 숫자 속성의 합계로 평가합니다.

예제

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

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

  • 장기 실행 프로젝트

RealmQuery<ProjectTask> tasksQuery = realm.where(ProjectTask.class);
/*
Aggregate operators do not support dot-notation, so you
cannot directly operate on a property of all of the objects
in a collection property.
You can operate on a numeric property of the top-level
object, however:
*/
Log.i("EXAMPLE", "Tasks average priority: " + tasksQuery.average("priority"));
val tasksQuery = realm.where(ProjectTask::class.java)
/*
Aggregate operators do not support dot-notation, so you
cannot directly operate on a property of all of the objects
in a collection property.
You can operate on a numeric property of the top-level
object, however:
*/Log.i("EXAMPLE", "Tasks average priority: " + tasksQuery.average("priority"))

이 페이지의 예시에서는 TeacherStudent의 두 가지 객체 유형을 사용합니다.

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

Teacher.java
import io.realm.RealmList;
import io.realm.RealmObject;
public class Teacher extends RealmObject {
private String name;
private Integer numYearsTeaching;
private String subject;
private RealmList<Student> students;
public Teacher() {}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getNumYearsTeaching() { return numYearsTeaching; }
public void setNumYearsTeaching(Integer numYearsTeaching) { this.numYearsTeaching = numYearsTeaching; }
public String getSubject() { return subject; }
public void setSubject(String subject) { this.subject = subject; }
public RealmList<Student> getStudents() { return students; }
public void setStudents(RealmList<Student> students) { this.students = students; }
}
Student.java
import io.realm.RealmObject;
import io.realm.RealmResults;
import io.realm.annotations.LinkingObjects;
public class Student extends RealmObject {
private String name;
private Integer year;
@LinkingObjects("students")
private final RealmResults<Teacher> teacher = null;
public Student() {}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getYear() { return year; }
public void setYear(Integer year) { this.year = year; }
public RealmResults<Teacher> getTeacher() { return teacher; }
}
Teacher.kt
import io.realm.RealmList
import io.realm.RealmObject
open class Teacher : RealmObject() {
var name: String? = null
var numYearsTeaching: Int? = null
var subject: String? = null
var students: RealmList<Student>? = null
}
Student.kt
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.LinkingObjects
open class Student : RealmObject() {
var name: String? = null
var year: Int? = null
@LinkingObjects("students")
val teacher: RealmResults<Teacher>? = null
}

플루언트 인터페이스 의 연산자 메서드를 사용하여 필터를 빌드할 수 있습니다. RealmQuery 클래스에 의해 노출됩니다.

// Build the query looking at all teachers:
RealmQuery<Teacher> query = realm.where(Teacher.class);
// Add query conditions:
query.equalTo("name", "Ms. Langtree");
query.or().equalTo("name", "Mrs. Jacobs");
// Execute the query:
RealmResults<Teacher> result1 = query.findAll();
// Or alternatively do the same all at once (the "Fluent interface"):
RealmResults<Teacher> result2 = realm.where(Teacher.class)
.equalTo("name", "Ms. Langtree")
.or()
.equalTo("name", "Mrs. Jacobs")
.findAll();
// Build the query looking at all teachers:
val query = realm.where(Teacher::class.java)
// Add query conditions:
query.equalTo("name", "Ms. Langtree")
query.or().equalTo("name", "Mrs. Jacobs")
// Execute the query:
val result1 = query.findAll()
// Or alternatively do the same all at once (the "Fluent interface"):
val result2 = realm.where(Teacher::class.java)
.equalTo("name", "Ms. Langtree")
.or()
.equalTo("name", "Mrs. Jacobs")
.findAll()

그러면 RealmResults 클래스의 새 인스턴스가 생성되며 여기에는 이름이 "Ms. Langtree" 또는 "Mrs. Jacobs"인 선생님이 포함됩니다.

RealmQuery 쿼리를 실행할 수 있는 여러 메서드가 포함되어 있습니다.

  • findAll()은 쿼리 조건을 충족하는 모든 객체를 찾을 때까지 차단합니다.

  • findAllAsync()은 즉시 반환하고 백그라운드 스레드에서 쿼리 조건을 비동기적으로 충족하는 모든 객체를 찾습니다.

  • findFirst()는 쿼리 조건을 충족하는 첫 번째 객체를 찾을 때까지 차단합니다.

  • findFirstAsync()는 즉시 반환하며 백그라운드 스레드에서 비동기적으로 쿼리 조건을 충족하는 첫 번째 객체를 찾습니다.

쿼리는 RealmResults 유형을 사용하여 일치하는 Realm 객체에 대한 참조 목록을 반환합니다.

객체 속성을 참조할 때는 점 표기법을 사용하여 해당 객체의 하위 속성을 참조할 수 있습니다. 점 표기법으로 내장된 객체 의 속성 및 관계를 참조할 수 있습니다.

예를 들어 "Wirt" 또는 "Greg" 라는 이름의 학생을 가진 선생님에 대한 쿼리를 생각해 보겠습니다.

// Find all teachers who have students with the names "Wirt" or "Greg"
RealmResults<Teacher> result = realm.where(Teacher.class)
.equalTo("students.name", "Wirt")
.or()
.equalTo("students.name", "Greg")
.findAll();
// Find all teachers who have students with the names "Wirt" or "Greg"
val result = realm.where(Teacher::class.java)
.equalTo("students.name", "Wirt")
.or()
.equalTo("students.name", "Greg")
.findAll()

점 표기법을 사용하여 역관계를 쿼리할 수도 있습니다.

// Find all students who have teachers with the names "Ms. Langtree" or "Mrs. Jacobs"
RealmResults<Student> result = realm.where(Student.class)
.equalTo("teacher.name", "Ms. Langtree")
.or()
.equalTo("teacher.name", "Mrs. Jacobs")
.findAll();
// Find all students who have teachers with the names "Ms. Langtree" or "Mrs. Jacobs"
val result = realm.where(Student::class.java)
.equalTo("teacher.name", "Ms. Langtree")
.or()
.equalTo("teacher.name", "Mrs. Jacobs")
.findAll()

중요

Realm은 지정한 순서대로 distinct(), sort()limit() 메서드를 적용합니다. 데이터 세트에 따라 쿼리 결과가 변경될 수 있습니다. 일반적으로 의도하지 않은 결과 세트를 피하려면 limit()을 마지막에 적용해야 합니다.

sort() 메서드를 사용하여 쿼리 결과의 순서를 정의할 수 있습니다.

// Find all students in year 7, and sort them by name
RealmResults<Student> result = realm.where(Student.class)
.equalTo("year", 7)
.sort("name")
.findAll();
// Alternatively, find all students in year 7
RealmResults<Student> unsortedResult = realm.where(Student.class)
.equalTo("year", 7)
.findAll();
// then sort the results set by name
RealmResults<Student> sortedResult = unsortedResult.sort("name");
// Find all students in year 7, and sort them by name
val result: RealmResults<Student> = realm.where(Student::class.java)
.equalTo("year", 7L)
.sort("name")
.findAll()
// Alternatively, find all students in year 7
val unsortedResult: RealmResults<Student> = realm.where(Student::class.java)
.equalTo("year", 7L)
.findAll()
// then sort the results set by name
val sortedResult = unsortedResult.sort("name")

정렬은 기본적으로 오름차순으로 결과를 정리합니다. 결과를 내림차순으로 정렬하려면 Sort.DESCENDING을 두 번째 인수로 전달합니다. 단일 속성 대신 속성 배열을 전달하여 동일한 속성 값 사이의 정렬 순서 연결을 해결할 수 있습니다. 동점인 경우 Realm은 연결된 객체를 후속 속성을 기준으로 순서대로 정렬합니다.

참고

문자열 정렬 제한 사항

Realm은 대문자와 소문자에 대해 비표준 정렬을 사용하여 대문자를 먼저 정렬하지 않고 함께 정렬합니다. 결과적으로 '- !"#0&()*,./:;?_+<=>123aAbBcC...xXyYzZ이 Realm의 실제 정렬 순서입니다. 또한 문자열 정렬은 Latin Basic, Latin Supplement, Latin Extended ALatin Extended B (UTF-8 range 0–591) 문자 세트만 지원합니다.

limit() 메서드를 사용하여 쿼리 결과 수를 특정 최대값으로 제한할 수 있습니다.

// Find all students in year 8, and limit the results collection to 10 items
RealmResults<Student> result = realm.where(Student.class)
.equalTo("year", 8)
.limit(10)
.findAll();
// Find all students in year 8, and limit the results collection to 10 items
val result: RealmResults<Student> = realm.where(Student::class.java)
.equalTo("year", 8L)
.limit(10)
.findAll()

제한된 결과 컬렉션은 다른 쿼리 결과와 마찬가지로 자동으로 업데이트됩니다. 따라서 기본 데이터가 변경되면 객체가 컬렉션에서 제외될 수 있습니다.

페이지 매김은 Realm 최적화에 필요하지 않습니다

일부 데이터베이스에서는 디스크에서 불필요한 데이터를 읽거나 너무 많은 메모리를 사용하지 않도록 제한을 두고 결과 페이지 매김을 권장합니다.

Realm 쿼리는 게으르기 때문에 이러한 조치를 취할 필요가 없습니다. Realm은 명시적으로 액세스한 경우에만 쿼리 결과에서 객체를 로드합니다.

제한된 결과에서 삭제된 알림

컬렉션 알림은 결과 세트에서 제외될 때 객체가 삭제된 것으로 보고합니다. 그렇다고 해서 반드시 기본 Realm에서 삭제된 것은 아니며 더 이상 쿼리 결과의 일부가 아니라는 의미일 뿐입니다.

distinct() 메서드를 사용하여 쿼리 결과를 지정된 필드에 대한 고유한 값으로 줄일 수 있습니다.

// Find all students in year 9, and cap the result collection at 10 items
RealmResults<Student> result = realm.where(Student.class)
.equalTo("year", 9)
.distinct("name")
.findAll();
// Find all students in year 9, and cap the result collection at 10 items
val result: RealmResults<Student> = realm.where<Student>(Student::class.java)
.equalTo("year", 9L)
.distinct("name")
.findAll()

정수, 롱, 숏 및 String 필드에서만 distinct()을(를) 호출할 수 있습니다. 다른 필드 유형에서는 예외가 발생합니다. 정렬과 마찬가지로 여러 필드를 지정하여 동점자를 해결할 수 있습니다.

where() 메서드를 호출하여 결과 컬렉션에 추가 필터를 적용할 수 있습니다.

// Find all students in year 9 and resolve the query into a results collection
RealmResults<Student> result = realm.where(Student.class)
.equalTo("year", 9)
.findAll();
// filter the students results again by teacher name
RealmResults<Student> filteredResults = result.where().equalTo("teacher.name", "Ms. Langtree").findAll();
// Find all students in year 9 and resolve the query into a results collection
val result: RealmResults<Student> = realm.where(Student::class.java)
.equalTo("year", 9L)
.findAll()
// filter the students results again by teacher name
val filteredResults =
result.where().equalTo("teacher.name", "Ms. Langtree").findAll()

where() 메서드는 find 메서드를 사용하여 RealmResults 로 해석할 수 있는 RealmQuery 을 반환합니다. 필터링된 결과는 원래 결과 세트와 동일한 유형의 객체만 반환할 수 있지만 그렇지 않은 경우 모든 필터를 사용할 수 있습니다.

버전 10.4.0에 추가되었습니다.

또한 영역에서 객체를 검색할 때 검색을 제한하는 문자열 기반 쿼리 언어인 Realm Query Language를 사용하여 영역을 쿼리할 수도 있습니다.

RealmQuery.rawPredicate() 를 사용할 수 있습니다. 구문, 사용법 및 제한 사항에 대한 자세한 내용은 RQL 참조를 참조하세요.

Realm Query Language는 Realm 모델 클래스에 정의된 클래스 및 속성 이름이나 @RealmField(으)로 정의된 내부 이름을 사용할 수 있습니다. 원시 조건자를 다른 원시 조건자 또는 RealmQuery(으)로 생성된 유형이 안전한 조건자와 결합할 수 있습니다.

// Build a RealmQuery based on the Student type
RealmQuery<Student> query = realm.where(Student.class);
// Simple query
RealmResults<Student> studentsNamedJane =
query.rawPredicate("name = 'Jane'").findAll();
// Multiple predicates
RealmResults<Student> studentsNamedJaneOrJohn =
query.rawPredicate("name = 'Jane' OR name = 'John'").findAll();
// Collection queries
RealmResults<Student> studentsWithTeachers =
query.rawPredicate("teacher.@count > 0").findAll();
RealmResults<Student> studentsWithSeniorTeachers =
query.rawPredicate("ALL teacher.numYearsTeaching > 5").findAll();
// Sub queries
RealmResults<Student> studentsWithMathTeachersNamedSteven =
query.rawPredicate("SUBQUERY(teacher, $teacher, $teacher.subject = 'Mathematics' AND $teacher.name = 'Mr. Stevens').@count > 0").findAll();
// Sort, Distinct, Limit
RealmResults<Student> students =
query.rawPredicate("teacher.@count > 0 SORT(year ASCENDING) DISTINCT(name) LIMIT(5)").findAll();
// Combine two raw predicates
RealmResults<Student> studentsNamedJaneOrHenry =
query.rawPredicate("name = 'Jane'")
.rawPredicate("name = 'Henry'").findAll();
// Combine raw predicate with type-safe predicate
RealmResults<Student> studentsNamedJaneOrHenryAgain =
query.rawPredicate("name = 'Jane'")
.equalTo("name", "Henry").findAll();
// Build a RealmQuery based on the Student type
val query = realm.where(Student::class.java)
// Simple query
val studentsNamedJane = query.rawPredicate("name = 'Jane'").findAll()
// Multiple predicates
val studentsNamedJaneOrJohn =
query.rawPredicate("name = 'Jane' OR name = 'John'").findAll()
// Collection queries
val studentsWithTeachers =
query.rawPredicate("teacher.@count > 0").findAll()
val studentsWithSeniorTeachers =
query.rawPredicate("ALL teacher.numYearsTeaching > 5").findAll()
// Sub queries
val studentsWithMathTeachersNamedSteven =
query.rawPredicate("SUBQUERY(teacher, \$teacher, \$teacher.subject = 'Mathematics' AND \$teacher.name = 'Mr. Stevens').@count > 0")
.findAll()
// Sort, Distinct, Limit
val students =
query.rawPredicate("teacher.@count > 0 SORT(year ASCENDING) DISTINCT(name) LIMIT(5)")
.findAll()
// Combine two raw predicates
val studentsNamedJaneOrHenry = query.rawPredicate("name = 'Jane'")
.rawPredicate("name = 'Henry'").findAll()
// Combine raw predicate with type-safe predicate
val studentsNamedJaneOrHenryAgain =
query.rawPredicate("name = 'Jane'")
.equalTo("name", "Henry").findAll()

Realm Query Language 예제도 참조하세요.

다음 페이지에서도 유용한 Realm Query Language 예제를 찾을 수도 있습니다.

돌아가기

삭제

다음

스레딩