Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - 읽기 - C++ SDK

이 페이지의 내용

  • 특성 읽기
  • 결과가 사본이 아님
  • 결과 지연
  • 참조 유지됨
  • 쿼리 결과 제한
  • 페이지 매김
  • Realm 객체 읽기
  • 주어진 유형의 모든 객체 쿼리
  • 객체 속성을 기준으로 쿼리 필터링
  • 지원되는 쿼리 연산자
  • 결과 세트 및 액세스 결과의 크기 확인
  • 지도 속성 읽기
  • 설정된 속성 읽기
  • 목록 정렬 및 결과 쿼리

객체를 찾고, 필터링하고, 정렬하여 Realm에 저장 한 데이터를 다시 읽을 수 있습니다.

영역에서의 읽기는 일반적으로 다음 단계로 구성됩니다.

  • 영역에서 특정 유형의 모든 객체를 가져옵니다.

  • 선택적으로 결과를 필터링합니다.

쿼리 작업결과 컬렉션 을 반환합니다. 이러한 컬렉션은 실시간이므로 항상 관련 쿼리의 최신 결과가 포함되어 있습니다.

최대한 효율적으로 데이터를 읽을 수 있도록 이 세 가지 주요 읽기 특성을 중심으로 앱의 데이터 액세스 패턴을 설계하세요.

쿼리에 대한 결과는 데이터의 복사본이 아닙니다. 쿼리 결과를 수정하면 디스크의 데이터가 직접 수정됩니다. 또한 이 메모리 매핑은 결과가 실시간 즉, 항상 디스크의 현재 상태를 반영한다는 의미이기도 합니다.

Realm은 사용자가 실제로 해당 쿼리의 결과를 요청할 때만 쿼리를 실행합니다. 이 지연 평가를 사용하면 대규모 데이터 세트와 복잡한 쿼리를 처리할 수 있는 고성능 코드를 작성할 수 있습니다. 중간 상태를 처리하기 위한 추가 작업 없이 여러 필터 작업을 연결할 수 있습니다.

Realm 객체 모델의 한 가지 이점은 Realm이 자동으로 모든 객체 관계 를 직접 참조로 유지한다는 것입니다. 이를 통해 쿼리 결과를 통해 관계 그래프를 직접 탐색할 수 있습니다.

직접 참조(포인터)를 사용하면 참조를 통해 관련 객체의 속성에 직접 액세스할 수 있습니다.

다른 데이터베이스는 직접 작업해야 할 때 일반적으로 데이터베이스 저장소의 객체를 애플리케이션 메모리로 복사합니다. 애플리케이션 객체에는 직접 참조가 포함되어 있으므로 각 직접 참조가 참조하는 객체가 필요할 경우 데이터베이스에서 객체를 복사하거나 각 객체에 대한 외래 키를 복사하고 해당 키에 액세스할 경우 해당 객체를 쿼리할 수 있습니다. 참조된 객체를 애플리케이션 메모리에 복사하면 액세스하지 않는 객체에 많은 리소스가 사용될 수 있는 반면 외래 키만 복사하도록 선택하면 참조된 객체 조회로 인해 애플리케이션 속도가 느려질 수 있습니다.

Realm은 제로 카피 라이브 객체를 사용하여 이 모든 과정을 우회합니다. Realm 객체 접근자는 메모리 매핑을 사용하여 데이터베이스 스토리지를 직접 지시하므로 영역의 객체와 애플리케이션 메모리의 쿼리 결과를 구분하지 않습니다. 이로 인해 쿼리 결과에서 전체 영역에 걸쳐 직접 참조를 순회할 수 있습니다.

평가가 지연되므로 Realm의 쿼리 결과를 제한하기 위한 특별한 메커니즘이 필요하지 않습니다. 예를 들어 쿼리가 수천 개의 객체와 일치하지만 처음 10개만 로드하려는 경우 결과 컬렉션의 처음 10개 요소에만 액세스하면 됩니다.

지연 평가 덕분에 일반적인 페이지 매김 작업이 아주 간단해집니다. 예를 들어 영역에 있는 수천 개의 객체와 일치하는 쿼리와 연결된 결과 컬렉션이 있다고 가정해 보겠습니다. 페이지당 100개의 객체를 표시합니다. 원하는 페이지로 이동하려면 대상 페이지에 해당하는 인덱스부터 결과 컬렉션의 요소에 액세스하기만 하면 됩니다.

Realm에서 지정된 유형의 객체를 쿼리하려면 YourClassName 객체 유형을 realm::query<T> 멤버 함수에 전달합니다.

영역에 있는 지정된 유형의 모든 객체를 나타내는 결과 객체를 반환합니다.

auto managedBusinesses = realm.objects<realm::Business>();

필터는 하나 이상의 객체 속성 값을 기반으로 결과의 하위 집합을 선택합니다. Realm은 필터를 정의하는 데 사용할 수 있는 모든 기능을 갖춘 쿼리 엔진을 제공합니다.

auto businessesNamedMongoDB = managedBusinesses.where(
[](auto &business) { return business.name == "MongoDB"; });

현재 Realm C++ SDK는 다음과 같은 쿼리 연산자를 지원합니다.

  • 등호(==, !=)

  • 보다 큰/작은 (>, >=, <, <=)

  • 복합 쿼리(||, &&)

Realm 결과 는 결과를 작업할 멤버 함수를 노출합니다. 결과 설정하다 의 크기를 확인하거나 특정 인덱스 에서 객체 에 액세스 있습니다.

auto managedBusinesses = realm.objects<realm::Business>();
auto businessesNamedMongoDB = managedBusinesses.where(
[](auto &business) { return business.name == "MongoDB"; });
CHECK(businessesNamedMongoDB.size() >= 1);
auto mongoDB = businessesNamedMongoDB[0];

또한 결과를 반복하거나 결과 세트의 변경 사항을 관찰할 수 있습니다.

표준 C++ 맵과 마찬가지로 영역 맵 속성 의 값을 반복하고 확인할 수 있습니다:

auto employees = realm.objects<realm::Employee>();
auto employeesNamedTommy = employees.where(
[](auto &employee) { return employee.firstName == "Tommy"; });
auto tommy = employeesNamedTommy[0];
// You can get an iterator for an element matching a key using `find()`
auto tuesdayIterator = tommy.locationByDay.find("Tuesday");
// You can access values for keys like any other map type
auto mondayLocation = tommy.locationByDay["Monday"];

다음과 같이 반복하고, 집합의 크기를 확인하고, 집합 속성에서 값을 찾을 수 있습니다.

auto repositories = realm.objects<realm::Repository>();
auto repositoriesNamedDocsRealm = repositories.where([](auto &repository) {
return repository.ownerAndName == "mongodb/docs-realm";
});
auto docsRealm = repositoriesNamedDocsRealm[0];
// You can check the size of the set
auto numberOfPullRequests = docsRealm.openPullRequestNumbers.size();
// Find an element in the set whose value is 3064
auto it = managedDocsRealm.openPullRequestNumbers.find(3064);
// Get a copy of the set that exists independent of the managed set
auto openRealmPullRequests = docsRealm.openPullRequestNumbers.detach();

정렬 작업을 통해 Realm이 목록 객체 및 쿼리 결과를 반환하는 순서를 구성할 수 있습니다. 목록 또는 결과 컬렉션에 있는 객체의 하나 이상의 속성을 기준으로 정렬할 수 있습니다. Realm은 명시적으로 정렬하는 경우에만 일관된 순서를 보장합니다.

std::sort 를 사용하는 것과는 다릅니다. Realm의 정렬 구현은 객체의 지연 로딩을 유지합니다. 전체 결과 세트 또는 목록 객체를 메모리로 가져오지 않고, 사용자가 액세스할 때만 메모리에 로드합니다.

정렬하려면 하나 이상의 sort_descriptor가 있는 목록 또는 결과 세트에서 .sort() 함수를 호출합니다.

sort_descriptor 에는 다음이 포함됩니다.

  • 정렬 기준으로 사용할 키 경로(문자열)입니다.

  • 정렬 순서를 지정하는 부울이며, 여기서 ``true``는 오름차순이고 false 은 내림차순입니다.

이 예제에서는 priority 에 대한 결과 세트를 내림차순으로 정렬합니다.

auto items = realm.objects<realm::Item>();
// Sort with `false` returns objects in descending order.
auto itemsSorted = items.sort("priority", false);

여러 정렬 설명자를 기준으로 목록 또는 결과 세트를 정렬할 수도 있습니다. 이 예제에서는 assignee 를 오름차순으로 정렬한 다음 priority 를 내림차순으로 정렬합니다.

auto sortedListProperty =
specificProject.items.sort({{"assignee", true}, {"priority", false}});

돌아가기

만들기