Flutter SDK 다트 언어 데이터 유형,BSON 유형의 제한된 하위 집합 및 UUID를 지원합니다.
특정 데이터 유형이 App Services 스키마의 BSON 유형에 매핑되는 방법을 알아보려면 Atlas App Services 문서의 데이터 모델 매핑을 참조하세요.
Dart 타입
Realm에서 지원하는 다트 타입은 다음과 같습니다.
intdoubleboolStringDateTime
날짜/시간
DateTime을 Realm Flutter SDK와 함께 사용하면 다른 Dart 타입과 같이 모델에서 선언할 수 있습니다.
() class _Vehicle { () late ObjectId id; late String nickname; late DateTime dateLastServiced; }
그러나 Realm은 DateTime을 UTC로 저장하니 유의하시기 바랍니다. DateTime를 사용하는 경우 UTC로 생성하거나 저장하기 전에 .toUtc()로 변환해야 합니다. 애플리케이션에 필요한 경우 Realm에서 읽을 때 로컬 시간대 또는 원하는 시간대로 다시 변환할 수 있습니다.
// Create a Realm object with date in UTC, or convert with .toUtc() before storing final subaruOutback = realm.write<Vehicle>(() { return realm.add( Vehicle(ObjectId(), 'Subie', DateTime.utc(2022, 9, 18, 12, 30, 0))); }); final fordFusion = Vehicle(ObjectId(), 'Fuse', DateTime(2022, 9, 18, 8, 30, 0).toUtc()); realm.write(() { realm.add(fordFusion); }); // When you query the object, the `DateTime` returned is UTC final queriedSubaruOutback = realm.all<Vehicle>().query('nickname == "Subie"')[0]; // If your app needs it, convert it to Local() or the desired time zone final localizedSubieDateLastServiced = queriedSubaruOutback.dateLastServiced.toLocal();
Realm 객체 참조하기
하나 이상의 Realm 객체를 다른 Realm 객체에서 참조할 수도 있습니다. 관계 속성 문서에서 자세히 알아보세요.
컬렉션
Realm 컬렉션에는 Realm 지원 데이터 타입의 인스턴스가 0개 이상 포함되어 있습니다. Realm 컬렉션에서 컬렉션의 모든 객체는 동일한 타입입니다.
Realm의 쿼리 언어를 사용하여 컬렉션을 필터링하고 정렬할 수 있습니다. 컬렉션은 라이브 객체이므로 항상 Realm 인스턴스의 현재 상태를 반영합니다. 컬렉션이나 해당 Realm에서 새 요소가 추가되거나 삭제되면 컬렉션의 내용이 업데이트됩니다.
변경 알림을 구독하여 컬렉션의 변경 사항을 수신할 수도 있습니다.
Realm에는 다음과 같은 유형의 컬렉션이 있습니다.
RealmList
Realm 객체에는 지원되는 모든 데이터 유형 의 목록이 포함될 수 있습니다. Realm RealmList 데이터 유형 사용하여 데이터를 저장 .
RealmList의 항목으로 RealmObjects를 포함하면 to-many 관계를 나타냅니다.
데이터베이스에서 객체를 삭제하면 해당 객체가 존재했던 RealmLists에서도 제거됩니다. 따라서 RealmObject 유형 중 RealmList는 절대로 null 값을 포함하지 않습니다. 또한 RealmList에는 동일한 RealmObject에 대한 여러 참조가 포함될 수 있습니다.
기본 유형의 RealmList에는 null 값이 포함될 수 있습니다. 리스트에서 null 값을 허용하고 싶지 않다면, 리스트 선언에서 nullable이 아닌 타입을 사용하세요 (예: List<int?> 대신 List<int> 사용).
RealmList는 변경 가능하며 쓰기 트랜잭션(write transaction) 내에서 RealmList의 요소를 추가하거나 제거할 수 있습니다.
스키마에 RealmList 추가하기
속성을 List<T> 타입으로 정의하여 Realm 객체 스키마에 RealmList를 추가할 수 있습니다. 여기서 T는 Realm 객체 모델에서 다른 컬렉션 제외하고 지원되는 모든 Realm 데이터 타입일 수 있습니다.
() class _Player { () late ObjectId id; late String username; // `inventory` property of type RealmList<Item> // where Items are other RealmObjects late List<_Item> inventory; // `traits` property of type RealmList<String> // where traits are Dart Strings. late List<String> traits; } () class _Item { () late ObjectId id; late String name; late String description; }
RealmList로 작업하기
버전 2.0.0에서 변경됨: Dynamic.getList()를 사용하여 속성 이름으로 RealmList 가져오기
다음 예시 RealmList의 몇 가지 기본적인 사용법을 보여줍니다. 사용 가능한 모든 메서드에 대한 자세한 내용은 RealmList 참조 문서를 참조하세요.
final artemis = realm.write(() => realm.add(Player(ObjectId(), 'Art3mis', inventory: [ Item(ObjectId(), 'elvish sword', 'sword forged by elves'), Item(ObjectId(), 'body armor', 'protects player from damage'), ], traits: [ 'brave', 'kind' ]))); // Get a RealmList by property name with dynamic.getList() final inventory = artemis.dynamic.getList('inventory'); // Use RealmList methods to filter results RealmList<String> traits = artemis.traits; final brave = traits.firstWhere((element) => element == 'brave'); final elvishSword = artemis.inventory.where((item) => item.name == 'elvish sword').first; // Query RealmList with Realm Query Language final playersWithBodyArmor = realm.query<Player>("inventory.name == \$0", ['body armor']); print("LEN ${playersWithBodyArmor.length}");
RealmSet
Realm 객체에는 다른 컬렉션 제외하고 지원되는 모든 데이터 유형 의 세트가 포함될 수 있습니다. Realm RealmSet 데이터 유형 사용하여 데이터를 저장 . RealmSet 컬렉션에서는 모든 값이 고유합니다. RealmSet 는 추가 Realm별 속성 및 메서드를 사용하여 네이티브 다트 세트 데이터 유형 확장합니다.
RealmSet의 항목으로 RealmObjects를 포함하면 to-many 관계를 나타냅니다.
RealmSet는 변경 가능하며 쓰기 트랜잭션(write transaction) 내에서 RealmSet의 요소를 추가하거나 제거할 수 있습니다.
스키마에 RealmSet 추가
속성을 Set<T> 타입으로 정의하여 Realm 객체 스키마에 RealmSet를 추가할 수 있습니다. 여기서 T는 Realm 객체 모델에서 다른 컬렉션을 제외하고 지원되는 모든 Realm 데이터 타입일 수 있습니다.
스키마에서 RealmSet을 정의할 때:
원시 타입의 Set는 nullable 또는non-nullable로 정의될 수 있습니다. 예를 들어
Set<int>와Set<int?>는 Realm 모두 스키마에서 유효합니다.RealmObject및RealmValue유형 세트는 null 불가능만 될 수 있습니다. 예를 들어Set<RealmValue>는 유효하지만Set<RealmValue?>는 유효하지 않습니다.스키마에서 세트를 정의할 때는 기본값을 정의할 수 없습니다. 예를 들어,
Set mySet = {0,1,2}는 유효하지 않습니다.
() class _RealmSetExample { late Set<String> primitiveSet; late Set<int?> nullablePrimitiveSet; late Set<_SomeRealmModel> realmObjectSet; } () class _SomeRealmModel { late ObjectId id; }
RealmSet로 작업하기
버전 2.0.0에서 변경됨: Dynamic.getSet()를 사용하여 속성 이름으로 RealmSet 가져오기
다음 예시 RealmSet의 몇 가지 기본적인 사용법을 보여줍니다. 사용 가능한 모든 메서드에 대한 자세한 내용은 RealmSet 참조 문서를 참조하세요.
final realm = Realm( Configuration.local([RealmSetExample.schema, SomeRealmModel.schema])); // Pass native Dart Sets to the object to create RealmSets final setExample = RealmSetExample( primitiveSet: {'apple', 'pear'}, nullablePrimitiveSet: {null, 2, 3}, realmObjectSet: {SomeRealmModel(ObjectId())}); // Add RealmObject to database realm.write(() => realm.add(setExample)); // Once you add the sets, they are of type RealmSet RealmSet primitiveSet = setExample.primitiveSet; // Modify RealmSets of RealmObjects in write transactions realm.write(() { // Add element to a RealmSet with RealmSet.add() setExample.realmObjectSet.add(SomeRealmModel(ObjectId())); // Remove element from a RealmSet with RealmSet.remove() setExample.primitiveSet.remove('pear'); }); // Check if a RealmSet contains an element with RealmSet.contains() if (setExample.primitiveSet.contains('apple')) { print('Set contains an apple'); } // Get RealmSet by property name with dynamic.getSet() final getSetResult = setExample.dynamic.getSet('primitiveSet'); // Check number of elements in a RealmSet with RealmSet.length print( 'Set now has ${getSetResult.length} elements'); // Prints 'Set now has 1 elements' // Query RealmSets using Realm Query Language final results = realm.query<RealmSetExample>('\$0 IN nullablePrimitiveSet', [null]);
RealmMap
버전 1.7.0에 새로 추가되었습니다.
RealmMap 은 <String, T>의 키-값 쌍을 포함하는 컬렉션 이며, 여기서 T 는 SDK에서 지원하는 모든 데이터 유형 입니다. 백분율 인코딩을사용하지 않는 한 맵 키에 . 를 포함하거나 로 시작할 수 없습니다.$
RealmMap은 변경 가능하며 쓰기 트랜잭션 내에서 RealmMap의 요소를 추가하거나 제거할 수 있습니다. 변경 리스너를 사용하여 RealmMap 항목 변경을 수신할 수 있습니다.
스키마에 RealmSet 추가
속성을 RealmMap<String, T> 타입으로 정의하여 Realm 객체 스키마에 RealmMap를 추가할 수 있습니다. 여기서 T는 Realm 객체 모델에서 다른 컬렉션 제외하고 지원되는 모든 Realm 데이터 타입일 수 있습니다.
() class _MapExample { late Map<String, int> map; late Map<String, int?> nullableMap; }
RealmMap으로 작업하기
버전 2.0.0에서 변경됨: Dynamic.getMap()을 사용하여 속성 이름으로 RealmMap 가져오기
다음 예시 RealmMap의 몇 가지 기본적인 사용법을 보여줍니다. 사용 가능한 모든 메서드에 대한 자세한 내용은 RealmMap 참조 문서를 참조하세요.
final realm = Realm(Configuration.local([MapExample.schema])); // Pass native Dart Maps to the object to create RealmMaps final mapExample = MapExample( map: { 'first': 1, 'second': 2, 'third': 3, }, nullableMap: { 'first': null, 'second': 2, 'third': null, }, ); // Add RealmObject to the database realm.write(() => realm.add(mapExample)); // Once you add maps, they are of type RealmMap RealmMap map = mapExample.map; // Modify RealmMaps in write transactions realm.write(() { // Update value by key with .update() or [value] = newValue mapExample.nullableMap['second'] = null; mapExample.map.update('first', (value) => 5); mapExample.nullableMap.update('fourth', (v) => 4, ifAbsent: () => null); // Add a new map entry with .addEntries() const newMap = {'fourth': 4}; mapExample.map.addEntries(newMap.entries); }); // Check a RealmMap with .containsKey() or .containsValue() if (mapExample.map.containsKey('first')) { print('Map contains key "first"'); } else if (mapExample.map.containsValue(null)) { print('Map contains null value'); } else { print('These aren\'t the maps you\'re looking for'); } // Get a RealmMap by property name with dynamic.getMap() final getPrimitiveMap = mapExample.dynamic.getMap('map'); // Check the number of elements in a RealmMap with RealmMap.length print( 'Map contains ${getPrimitiveMap.length} elements'); // Prints 'Map contains 4 elements' // Query RealmMaps using Realm Query Language final results = realm.query<MapExample>('map.first == \$0', [5]);
RealmResults
A RealmResults 컬렉션 쿼리 작업의 지연 평가 결과를 나타냅니다. RealmList와 달리 결과는 변경되지 않으며 결과 컬렉션 에 요소를 추가하거나 제거 할 수 없습니다. 이는 결과 컬렉션 의 내용이 데이터베이스 대한 쿼리 에 의해 결정되기 때문입니다.
Realm.all() 및 Realm. 쿼리() RealmResults를 반환합니다. Realm 쿼리에 대한 자세한 내용은 읽기 작업을 참조하세요.
RealmResults<Player> players = realm.all<Player>(); RealmResults<Player> bravePlayers = realm.query<Player>('ANY traits == \$0', ['brave']);
결과는 지연되어 평가됩니다.
Realm은 결과 컬렉션의 요소에 접근하는 등 실제로 쿼리 결과를 요청할 때만 쿼리를 실행합니다. 이 지연 평가를 사용하면 대규모 데이터 세트와 복잡한 쿼리를 처리할 수 있는 우아하고 성능이 뛰어난 코드를 작성할 수 있습니다.
라이브 컬렉션
라이브 오브젝트와 마찬가지로 Realm 컬렉션은 일반적으로 실시간입니다.
라이브 결과 컬렉션 은 항상 관련 쿼리의 현재 결과를 반영합니다.
RealmObjects의 라이브 목록은 항상 영역 인스턴스에서 관계의 현재 상태를 반영합니다.
그러나 컬렉션이 라이브 상태가 아닌 경우는 두 가지가 있습니다:
컬렉션은 관리되지 않은 경우. 즉, 아직 Realm에 추가되지 않았거나 Realm에서 복사한 Realm 객체의
RealmList속성입니다.컬렉션이 동결되었습니다.
컬렉션의 변경 사항을 수신하는 기능과 함께, 라이브 컬렉션을 사용하면 깔끔하고 반응이 빠른 코드를 만들 수 있습니다. 예를 들어 뷰가 쿼리 결과를 표시한다고 가정해 보겠습니다. 뷰 클래스에 결과 컬렉션에 대한 참고를 유지한 다음, 필요할 때마다 결과 컬렉션을 읽어서 새로고침하거나 최신 상태인지 확인할 필요 없이 사용할 수 있습니다.
중요
인덱스가 변경될 수 있습니다.
결과는 자동으로 업데이트되므로 컬렉션에 있는 객체의 위치 인덱스나 컬렉션에 있는 객체의 개수를 저장하지 않도록 합니다. 저장된 인덱스 또는 카운트 값은 사용 시점에 따라 이미 오래된 정보일 수 있습니다.
추가적으로 지원되는 데이터 타입
ObjectId
ObjectId는 객체의 식별자로 사용할 수 있는 MongoDB 전용 12바이트의 고유한 값입니다. ObjectId는 인덱싱이 가능하며 프라이머리 키로 사용될 수 있습니다.
속성을 ObjectId로 정의하려면 객체 모델에서 타입을 ObjectId로 설정하세요.
() class _ObjectIdPrimaryKey { () late ObjectId id; }
객체의 고유 식별자 속성을 설정하려면 ObjectId()를 호출하세요. 또는 문자열을 ObjectId()에 전달하여 고유 식별자 속성을 특정 값으로 설정합니다.
final id = ObjectId(); final object = ObjectIdPrimaryKey(id);
UUID
UUID(범용 Unique Identifier)는 16바이트의 고유 값입니다. UUID를 객체의 식별자로 사용할 수 있습니다. UUID는 인덱싱이 가능하며 프라이머리 키로 사용할 수 있습니다.
참고
ObjectId 대신 UUID 사용하기
일반적으로 고유 식별자 역할을 하는 모든 필드에 UUID를 사용할 수 있습니다. MongoDB에 저장되지 않은 데이터를 마이그레이션하는 경우 UUID 사용이 특히 유용할 수 있습니다. 왜냐하면 이 경우 객체의 고유 식별자가 이미 UUID 유형일 가능성이 높기 때문입니다.반면에 MongoDB에 이미 존재하는 데이터 컬렉션에는 ObjectId를 사용하는 것이 유용할 수 있습니다.
속성을 UUID로 정의하려면 객체 모델에서 해당 타입을 Uuid로 설정합니다.
() class _UuidPrimaryKey { () late Uuid id; }
객체의 고유 식별자 속성을 임의의 값으로 설정하려면 Uuid 메서드 중 하나를 호출하여 UUID를 만드세요 (예: Uuid.v4()).
final myId = Uuid.v4(); final object = UuidPrimaryKey(myId);
Decimal128
다트 에는 네이티브 십진수 유형이 없습니다. IEEE-754 의 비트 구현 인 Decimal128 을 사용할 수 있습니다.128 십진수 유형을 정의할 때는 Decimal128 BSON types를 사용하세요.
Decimal128을 사용할 때 Dart의 compareTo() 메서드는 Dart double 타입을 모방한 전체 순서를 구현한다는 점에 유의하세요. 즉, compareTo()를 사용할 때 다음과 같은 사항이 적용됩니다.
모든
NaN값은 모든 숫자 값 이상으로 간주됩니다.-Decimal128.zeroDecimal128.zero(및 정수 0)보다 작지만 0이 아닌 음수 값보다 큽니다.음의 무한대는 다른 모든 값보다 작고 양의 무한대는 NaN이 아닌 모든 값보다 큽니다.
다른 모든 값은 숫자 값을 사용하여 비교됩니다.
Realm 값
중요
Flutter SDK v2.0.0 RealmValue 변경 사항
Flutter SDK 버전 2.0.0 RealmValue 을(를) 업데이트하여 List 또는 Map 유형의 RealmValue 을(를) 허용하므로 구조화되지 않은 데이터를 모델링할 때 더 많은 유연성을 사용할 수 있습니다. 자세한 내용은 구조화되지 않은 데이터 모델링 을 참조하세요.
이 업데이트에는 v2.0.0 이상으로 업그레이드할 때 앱에 영향을 줄 수 있는 다음과 같은 호환성이 손상되는 변경도 포함되어 있습니다.
RealmValue.type이제TypeRealmValueType의 열거형입니다.RealmValue.uint8List의 이름이RealmValue.binary으로 변경되었습니다.
기존 앱 을 이전 버전에서 v2.0.0 이상으로 업그레이드 하는 방법에 대한 자세한 내용은 Flutter SDK v2.0.0 로 업그레이드를 참조하세요.
RealmValue 데이터 유형 포함된 객체를 제외한 다른 모든 유효한 데이터 유형 나타낼 수 있는 혼합 데이터 유형 입니다. Flutter SDK v2에서.0.0 RealmValue 는 List<RealmValue> 또는 Map<String, RealmValue>를 나타낼 수 있습니다.
RealmValue 속성 정의
RealmValue 속성을 정의하려면 객체 모델에서 해당 유형을 설정합니다. RealmValue 은(는) 인덱싱이 가능하지만 프라이머리 키가 될 수 없습니다. 속성을 RealmValue 유형의 컬렉션(목록, 세트 또는 맵)으로 정의할 수도 있습니다.
() class _RealmValueExample { () late RealmValue singleAnyValue; late List<RealmValue> listOfMixedAnyValues; late Set<RealmValue> setOfMixedAnyValues; late Map<String, RealmValue> mapOfMixedAnyValues; }
참고
RealmValue는 Null을 허용하지 않지만 Null 값을 포함할 수 있습니다.
Realm 객체 스키마를 정의할 때 nullable한 RealmValue를 만들 수 없습니다. 그러나 RealmValue 속성에 null 값이 포함되도록 하려면 특수 RealmValue.nullValue() 속성을 사용할 수 있습니다.
RealmValue 만들기
Realm 객체에 RealmValue 를 추가하려면 데이터에서 RealmValue.from() 를 호출하거나 RealmValue.nullValue() 를 호출하여 null 값을 설정합니다.
final realm = Realm(Configuration.local([RealmValueExample.schema])); realm.write(() { // Use 'RealmValue.from()' to set values var anyValue = realm.add(RealmValueExample( // Add a single `RealmValue` value singleAnyValue: RealmValue.from(1), // Add a list of `RealmValue` values listOfMixedAnyValues: [Uuid.v4(), 'abc', 123].map(RealmValue.from), // Add a set of `RealmValue` values setOfMixedAnyValues: { RealmValue.from('abc'), RealmValue.from('def') }, // Add a map of string keys and `RealmValue` values mapOfMixedAnyValues: { '1': RealmValue.from(123), '2': RealmValue.from('abc') })); // Use 'RealmValue.nullValue()' to set null values var anyValueNull = realm.add(RealmValueExample( singleAnyValue: RealmValue.nullValue(), listOfMixedAnyValues: [null, null].map(RealmValue.from), setOfMixedAnyValues: {RealmValue.nullValue()}, mapOfMixedAnyValues: {'null': RealmValue.nullValue()}));
RealmValue 데이터 유형에 액세스
버전 2.0.0에서 변경됨: RealmValueType 열거형이 RealmValue.type 을(를) 대체합니다. RealmValue.binary RealmValue.uint8List 을(를) 대체합니다.
RealmValue 에 저장된 데이터에 액세스하려면 다음을 사용할 수 있습니다.
RealmValue.valueObject?을 반환합니다.RealmValue.as<T>, 데이터를 가져와서 원하는 유형으로 캐스팅합니다.
for (var obj in data) { for (var mixedValue in obj.listOfMixedAnyValues) { // Use RealmValue.value to access the value final value = mixedValue.value; if (value is int) { sum = sum + value; } else if (value is String) { combinedStrings += value; } // Use RealmValue.as<T> to cast value to a specific type try { final intValue = mixedValue.as<int>(); sum = sum + intValue; } catch (e) { log('Error casting value to int: $e'); } } }
type 속성에 액세스하여 RealmValue 속성에 현재 저장된 데이터 유형을 확인할 수 있습니다. Flutter SDK v2.0.0 부터 RealmValueType 열거형을 반환합니다. 이전 SDK 버전에서는 SDK가 RealmValue.value.runtimeType 을(를) 반환했습니다.
다음 예제에서는 RealmValueType 를 사용하여 데이터 유형에 따라 계산을 실행합니다.
final data = realm.all<RealmValueExample>(); for (var obj in data) { final anyValue = obj.singleAnyValue; // Access the RealmValue.type property switch (anyValue.type) { // Work with the returned RealmValueType enums case RealmValueType.int: approximateAge = DateTime.now().year - anyValue.as<int>(); break; case RealmValueType.dateTime: approximateAge = (DateTime.now().difference(anyValue.as<DateTime>()).inDays / 365) .floor(); break; case RealmValueType.string: final birthday = DateTime.parse(anyValue.as<String>()); approximateAge = (DateTime.now().difference(birthday).inDays / 365).floor(); break; // Handle other possible types ... default: log('Unhandled type: ${anyValue.type}'); } }
혼합 컬렉션
버전 2.0.0에서 변경됨: RealmValue 속성에는 혼합 데이터의 목록 또는 맵이 포함될 수 있습니다.
버전 2.0.0 이상에서 혼합 데이터 유형 은 혼합 요소의 컬렉션( 설정하다 는 제외 )(목록 또는 맵)을 보유할 수 있습니다. 혼합 컬렉션을 사용하여 구조화되지 않은 데이터 또는 가변 데이터를 모델링할 수 있습니다. 자세한 내용은 구조화되지 않은 데이터 모델링을 참조하세요.
혼합 컬렉션을 최대 100 수준까지 중첩할 수 있습니다.
일반 컬렉션 과 마찬가지로 혼합 컬렉션 속성을 쿼리 하고 변경 사항에 대한 리스너를 등록 할 수 있습니다.
개별 혼합 컬렉션 요소를 찾고 업데이트 할 수 있습니다.
혼합 컬렉션에는 세트 또는 포함된 객체를 저장 수 없습니다 .
혼합 컬렉션을 사용하려면 데이터 모델 에서 혼합 유형 속성 을 정의합니다. 그런 다음 RealmValue.from() 을 사용하여 목록 또는 맵 컬렉션을 만듭니다.
realm.write(() { realm.add(RealmValueCollectionExample( // Set the RealmValue as a map of mixed data singleAnyValue: RealmValue.from({ 'int': 1, // You can nest RealmValues in collections 'listOfInt': [2, 3, 4], 'mapOfStrings': {'1': 'first', '2': 'second'}, // You can also nest collections within collections 'mapOfMaps': [ { 'nestedMap_1': {'1': 1, '2': 2}, 'nestedMap_2': {'3': 3, '4': 4} } ], 'listOfMaps': [ { 'nestedList_1': [1, 2, 3], 'nestedList_2': [4, 5, 6] } ] })));
Uint8List
단위8목록 은 dart:typed_data의 바이너리 데이터 유형 입니다. 이 데이터 유형 객체 모델 및 속성 값에 사용할 수 있습니다.
속성을 Uint8List로 정의하려면 먼저 dart:typed_data를 가져와야 합니다. 그런 다음 객체 모델에서 객체의 타입을 Uint8List로 설정합니다.
() class _BinaryExample { late String name; late Uint8List requiredBinaryProperty; late Uint8List? nullableBinaryProperty; }
Realm 객체에 Uint8List 추가하려면 데이터에 대해 Uint8List.fromList()를 호출하세요.
final realm = Realm(Configuration.local([BinaryExample.schema])); realm.write(() { realm.addAll([ BinaryExample("Example binary object", Uint8List.fromList([1, 2])) ]); });
내장된 객체
Realm은 각 임베디드 객체를 부모 객체 내부에 중첩된 데이터로 취급합니다. 임베디드 객체는 부모 객체의 라이프사이클을 상속합니다. 이 객체는 독립적인 Realm 객체로 존재할 수 없습니다. 임베디드 객체에는 다음과 같은 속성이 있습니다.
임베디드 객체는 부모 객체가 삭제되거나 부모가 더 이상 참조하지 않을 때 삭제됩니다.
임베디드 객체를 다른 부모 객체에 다시 할당할 수 없습니다.
여러 부모 객체에서 한 임베디드 객체에 연결할 수 없습니다.
부모 객체를 통해 액세스해야만 임베디드 객체를 쿼리할 수 있습니다.
ObjectType.embeddedObject를 주석에 @RealmModel() 전달하여 포함된 객체를 선언합니다. 포함된 객체는 상위 객체의 RealmModel에서 정의할 때 null을 허용해야 합니다. 또한 포함된 객체의 스키마를 Realm의 구성에 포함해야 합니다.
다음 예시는 Realm 스키마에서 임베디드 객체를 모델링하는 방법을 보여줍니다. _Address 모델은 _Person 모델 내에 포함됩니다.
// The generated `Address` class is an embedded object. (ObjectType.embeddedObject) class _Address { late String street; late String city; late String state; late String country; } () class _Person { () late ObjectId id; late String name; // Embedded object in parent object schema late _Address? address; // Must be nullable }
상위 속성을 사용하여 내장된 객체의 상위 항목에 액세스할 수 있습니다.
다음 예에서는 임베디드 객체로 작업할 때 고유한 고려 사항을 보여줍니다. 이 예시에서는 위 스키마의 _Address RealmModel에서 생성된 Address 임베디드 객체를 사용합니다.
// Both parent and embedded objects in schema final realm = Realm(Configuration.local([Person.schema, Address.schema])); // Create an embedded object. final joesHome = Address("500 Dean Street", "Brooklyn", "NY", "USA"); final joePrimaryKey = ObjectId(); final joe = Person(joePrimaryKey, "Joe", address: joesHome); realm.write(() => realm.add(joe)); // Update an embedded object property. realm.write(() { joe.address?.street = "800 Park Place"; }); // Query a collection of embedded objects. // You must access the embedded object through the parent RealmObject type. final peopleWithNewYorkHomes = realm.query<Person>("address.state = 'NY'"); // Overwrite an embedded object. // Also deletes original embedded object from realm. final joesNewHome = Address("12 Maple Way", "Toronto", "ON", "Canada"); realm.write(() { joe.address = joesNewHome; }); // You can access the parent object from an embedded object. final thePersonObject = joesNewHome.parent; // Delete embedded object from parent object. realm.write(() => realm.delete(joe.address!)); // Add address back for the following example. final anotherNewHome = Address("202 Coconut Court", "Miami", "FL", "USA"); realm.write(() { joe.address = anotherNewHome; }); // Deleting the parent object also deletes the embedded object. realm.write(() => realm.delete(joe));
예시
다음 모델에는 지원되는 일부 데이터 타입이 포함되어 있습니다.
part 'car.realm.dart'; // The generated `Address` class is an embedded object. (ObjectType.embeddedObject) class _Address { late String street; late String city; late String state; late String country; } () class _Person { () late ObjectId id; late String name; // Embedded object in parent object schema late _Address? address; // Must be nullable } () class _Car { () late ObjectId id; String? licensePlate; bool isElectric = false; double milesDriven = 0; late List<String> attributes; late _Person? owner; }