문서 메뉴

문서 홈애플리케이션 개발Atlas Device SDK

모델 데이터 - Swift SDK

이 페이지의 내용

  • 객체 유형 및 스키마
  • Realm 스키마
  • 모델 상속
  • Swift 구조
  • 속성
  • Realm이 있는 모델 보기
  • 관계
  • 일대일 관계
  • To-Many 관계
  • 역관계

Realm 애플리케이션은 데이터를 각각 지원되는 데이터 유형을 하나 이상 포함하는 필드-값 쌍으로 구성된 객체로 모델링합니다.

Realm 객체는 일반적인 Swift 또는 오브젝티브-C 클래스이지만 라이브 쿼리 와 같은 몇 가지 추가 기능도 제공합니다. Swift SDK 메모리는 Realm 객체를 네이티브 Swift 또는 오브젝티브-C 객체에 직접 매핑하므로 ORM 과 같은 특수 데이터 액세스 라이브러리를 사용할 필요가 없습니다. . 대신 다른 클래스 인스턴스와 마찬가지로 Realm 객체로 작업할 수 있습니다.

모든 Realm 객체는 특정 객체 유형 을 준수하며, 이는 기본적으로 해당 유형의 객체에 대한 속성관계 를 정의하는 클래스입니다. Realm은 Realm의 모든 객체가 해당 객체 유형의 스키마를 준수하도록 보장하고 객체가 생성, 수정 또는 삭제될 때마다 객체의 유효성을 검사합니다.

예제

다음 스키마는 문자열 이름, 선택적 문자열 유형, 생년월일 및 기본 키 ID를 사용하여 Dog 객체 유형을 정의합니다.

영역 스키마 는 영역에 포함될 수 있는 유효한 객체 스키마 목록입니다. 모든 Realm 객체는 해당 Realm의 스키마에 포함된 객체 유형을 준수해야 합니다.

기본적으로 Swift SDK는 RLMObject 또는 RLMEmbeddedObject 에서 파생되는 프로젝트의 모든 클래스를 Realm 스키마에 자동으로 추가합니다.

Realm 스키마 구성

Realm이 Realm 스키마에 추가하는 클래스를 제어하려면 Realm에 클래스 하위 집합 제공을 참조하세요.

Realm을 열 때 Realm에 이미 데이터가 포함되어 있는 경우 Realm은 각 객체의 유효성을 검사하여 해당 유형에 대한 객체 스키마가 제공되었는지, 그리고 스키마에 지정된 모든 제약 조건을 충족하는지 확인합니다.

Realm 작업 방법 알아보기

Swift SDK에서 Realm을 구성하고 여는 방법을 보여주는 코드 예제는 Realm 구성 및 열기 - Swift SDK를 참조하세요.

Realm 모델을 서브클래스화하여 클래스 간에 동작을 공유할 수 있지만 한계가 있습니다. 특히 Realm에서는 다음이 허용되지 않습니다.

  • 다형성 클래스 간 캐스트: 하위 클래스에서 하위 클래스로, 하위 클래스에서 상위 클래스로, 상위에서 하위 클래스로

  • 여러 클래스에 대한 동시 쿼리: '상위 클래스 및 하위 클래스의 모든 인스턴스 가져오기' 등

  • 다중 클래스 컨테이너: 상위 클래스와 하위 클래스가 혼합된 ListResults

코드 샘플 확인하기 를 참조하세요.

버전 10.10.0의 새로운 기능: 클래스 내에서 @Persisted@objc dynamic 속성 선언을 혼합할 수는 없지만 기본 및 하위 클래스 간에 표기법 스타일을 혼합할 수 있습니다. 예를 들어 기본 클래스에는 @Persisted var foo: Int 속성이 있고 하위 클래스에는 @objc dynamic var bar = 0 속성이 있을 수 있으며 둘 다 지속될 수 있습니다. 그러나 @Persisted 속성이 동일한 기본 또는 하위 클래스 내에 있는 경우 @objc dynamic 속성은 무시됩니다.

Realm은 여러 가지 이유로 Swift 구조체를 모델로 지원하지 않습니다. Realm의 디자인은 '라이브' 객체에 중점을 둡니다. 이 개념은 값 유형 구조체와 호환되지 않습니다. 의도적으로 Realm은 다음과 같은 의미 체계와 호환되지 않는 기능을 제공합니다.

하지만 때로는 객체를 배경 영역에서 분리하는 것이 유용할 때도 있습니다. 일반적으로 이상적인 디자인 결정은 아닙니다. 대신 개발자는 라이브러리의 일시적인 제한 사항에 대한 해결 방법으로 이 기능을 사용합니다.

키-값 코딩을 사용하여 관리되지 않는 객체를 관리되는 객체의 복사본으로 초기화할 수 있습니다. 그런 다음 다른 NSObject와 마찬가지로 관리되지 않는 객체로 작업할 수 있습니다.

let standaloneModelObject = MyModel(value: persistedModelObject)

Realm 객체 모델은 속성들의 컬렉션입니다. 가장 기본적인 수준에서 모델을 생성할 때 선언은 각 속성에 대한 Realm 정보를 제공합니다.

  • 데이터 유형 및 속성이 선택 사항인지 필수 사항인지 여부

  • Realm이 속성을 저장할지 무시할지 여부

  • 속성이 프라이머리 키인지 또는 인덱싱해야 하는지 여부

속성은 Realm 객체 유형 간의 관계 를 설정하는 메커니즘이기도 합니다.

Realm Swift SDK는 리플렉션을 사용하여 런타임 시 모델의 속성을 결정합니다. 프로젝트는 SWIFT_REFLECTION_METADATA_LEVEL = none을(를) 설정해서는 안 됩니다. 그렇지 않으면 Realm은 속성이나 열거형 케이스와 같은 유형의 하위 항목을 찾을 수 없습니다. 리플렉션은 프로젝트가 이 세팅에 대한 레벨을 구체적으로 설정하지 않는 경우 기본적으로 활성화됩니다.

버전 10.21.0의 새로운 기능

클래스 프로젝션을 생성하여 Realm 객체 속성의 하위 집합을 사용할 수 있습니다. 클래스 프로젝션은 Realm 객체의 속성 중 일부 또는 전부를 통과하거나 변환하는 클래스입니다. 클래스 프로젝션을 사용하면 Realm 객체 모델의 추상화를 사용하는 보기 모델을 구축할 수 있습니다. 이렇게 하면 애플리케이션에서 Realm 객체를 사용하고 테스트하는 것이 간단해집니다.

클래스 프로젝션을 사용하면 객체 속성의 일부를 UI에서 직접 사용하거나 변환할 수 있습니다. 이를 위해 클래스 프로젝션을 사용하면 Realm의 라이브 객체의 이점을 모두 얻을 수 있습니다.

  • 클래스 프로젝션 객체의 실시간 업데이트

  • 변경 사항 관찰 가능

  • 쓰기 트랜잭션의 속성에 변경 사항 직접 적용 가능

다음도 참조하세요.

Realm은 관계형 데이터베이스에서와 같이 관계를 정의하기 위해 브리지 테이블이나 명시적 조인을 사용하지 않습니다. Realm은 포함된 객체나 다른 Realm 객체에 대한 참조 속성을 통해 관계를 처리합니다. 이러한 속성에서 직접 읽고 쓸 수 있습니다. 이렇게 하면 다른 속성을 쿼리하는 것처럼 관계 쿼리 성능이 향상됩니다.

Realm은 대일, 대다역관계를 지원합니다.

대일 관계는 하나의 객체가 다른 객체와 연관되어 있음을 의미합니다. 객체 스키마에서 객체 유형에 대한 대일 관계를 정의합니다. 유형이 관련 Realm 객체 유형인 속성을 지정합니다. 예를 들어, 개는 좋아하는 장난감과 대일 관계를 가질 수 있습니다.

대일 관계를 정의하는 방법을 알아보려면 대일 관계 속성 정의를 참조합니다.

대다 관계란 한 객체가 둘 이상의 다른 객체와 관련되어 있음을 의미합니다. Realm에서 대다 관계는 다른 객체에 대한 참조 목록입니다. 예를 들어, 한 사람이 여러 마리의 개를 키우고 있을 수 있습니다.

목록 은 두 Realm 유형 간의 대다 관계를 나타냅니다. 목록은 변경 가능합니다: 쓰기 트랜잭션(write transaction) 내에서 목록에 요소를 추가하고 제거할 수 있습니다. 목록은 쿼리와 연결되지 않으며 일반적으로 객체 모델의 속성으로 선언됩니다.

대다 관계를 정의하는 방법을 알아보려면 대다 관계 속성 정의를 참조합니다.

Realm의 관계 정의는 단방향입니다. 역관계는 해당 객체를 참조하는 객체에 다시 연결합니다. 객체 모델의 속성을 역관계로 명시적으로 정의해야 합니다. 역관계는 대일 또는 대다 관계의 객체에 다시 연결할 수 있습니다.

LinkingObjects 컬렉션은 두 Realm 유형 간의 역관계를 나타냅니다. LinkingObjects 컬렉션에서 항목을 직접 추가하거나 제거할 수 없습니다.

역관계는 해당 백링크로 자동으로 업데이트됩니다. 수동 쿼리로 동일한 Realm 객체 세트를 찾을 수 있지만 역 관계 필드는 상용구 쿼리 코드와 오류 용량을 줄여줍니다.

예를 들어 '작업이 많은 사용자'라는 대다 관계가 있는 작업 추적기를 생각해 봅니다. 이는 '작업이 사용자에게 속함'이라는 역관계를 자동으로 생성하지 않습니다. 역관계를 만들려면 작업의 소유자를 가리키는 사용자 속성을 작업에 추가하세요. 작업과 사용자 간의 역관계를 지정하면 이에 대해 쿼리할 수 있습니다. 역관계를 지정하지 않으면 별도의 쿼리를 실행하여 작업이 할당된 사용자를 조회해야 합니다.

중요

역관계 속성의 값은 수동으로 설정할 수 없습니다. 대신 Realm은 관계에 객체를 추가하거나 제거할 때 암시적 관계를 업데이트합니다.

관계는 다대일 또는 다대다 관계일 수 있습니다. 따라서 역관계를 따르면 0개, 1개 또는 다수의 객체가 생성될 수 있습니다.

역관계를 정의하는 방법을 알아보려면 역관계 속성 정의를참조하세요.

← tvOS용 빌드