CRUD - 생성 - Flutter SDK
Atlas Device SDK는 매우 효율적인 스토리지 엔진을 사용하여 객체를 지속합니다. 객체를 생성하고, 데이터베이스에서 객체를 업데이트하고, 최종적으로 데이터베이스에서 객체를 삭제할 수 있습니다. 이러한 작업은 데이터베이스의 상태를 수정하기 때문에 쓰기 작업이라고 합니다.
쓰기 트랜잭션(write transaction)
SDK는 트랜잭션 측면에서 쓰기를 처리합니다. 트랜잭션은 SDK가 분할할 수 없는 단일 작업으로 처리하는 읽기 및 쓰기 작업 목록입니다. 즉, 트랜잭션은 전부 아니면 전무입니다. 즉, 트랜잭션의 모든 작업이 성공하거나 트랜잭션의 모든 작업이 적용되지 않습니다.
모든 쓰기는 트랜잭션에서 이루어져야 합니다.
데이터베이스는 한 번에 하나의 오픈 트랜잭션만 허용합니다. SDK는 열려 있는 트랜잭션이 완료될 때까지 다른 스레드에서 다른 쓰기를 차단합니다. 따라서 트랜잭션 내의 데이터베이스에서 값을 읽을 때 경쟁 상태가 없습니다.
트랜잭션을 완료하면 SDK가 트랜잭션을 커밋하거나 취소합니다.
SDK는 트랜잭션을 커밋할 때 모든 변경 사항을 디스크에 기록합니다. 동기화된 데이터베이스의 경우 SDK는 Atlas Device Sync와의 동기화를 위해 변경 사항을 대기열에 넣습니다.
SDK가 쓰기 트랜잭션(write transaction)을 취소하거나 트랜잭션 작업으로 인해 오류가 발생하면 모든 변경 사항이 삭제됩니다(또는 "롤백").
쓰기 작업
데이터베이스를 연 후에는 Realm 을 사용하여 데이터베이스 내에 객체를 만들 수 있습니다. 쓰기 (write)() 트랜잭션 차단.
realm.write((){ // ...write data to realm });
쓰기 트랜잭션(write transaction) 콜백 함수에서 값을 반환할 수도 있습니다.
final yoda = realm.write<Person>(() { return realm.add(Person(ObjectId(), 'Yoda')); });
경고
하나의 Realm 파일에 Realm 객체 쓰기
하나의 영역 파일에는 RealmObjects
만 쓸 수 있습니다. 이미 한 영역 파일에 RealmObject
를 쓴 경우 다른 데이터베이스에 쓰려고 하면 SDK에서 RealmException
를 .발생시킵니다
백그라운드 쓰기
Realm.writeAsync()를사용하여 객체를 비동기적으로 추가, 수정 또는 삭제할 수 있습니다.
Realm.writeAsync()
를 사용하여 쓰기 작업을 수행하는 경우 백그라운드에서 쓰기 잠금(write lock)을 확보하기 위해 대기하고 트랜잭션을 커밋합니다. 쓰기 자체만 메인 프로세스에서 발생합니다.
이렇게 하면 메인 프로세스의 실행을 차단하는 데 소요되는 시간을 줄일 수 있습니다. 이 기능은 동기화 클라이언트가 언제, 얼마나 오래 작성할지 알 수 없는 Device Sync를 사용할 때 특히 유용합니다.
// Add Leia to the realm using `writeAsync` Person leia = Person(ObjectId(), "Leia"); realm.writeAsync(() { realm.add<Person>(leia); });
객체 생성
이 페이지의 예시에서는 Person
및 Team
이라는 두 가지 객체 유형을 사용합니다.
()class _Person { () late ObjectId id; late String name; late List<String> hobbies; } ()class _Team { () late ObjectId id; late String name; late List<_Person> crew; late RealmValue eventLog; }
하나의 객체 생성
데이터베이스에 객체를 추가하려면 Realm.add()를 사용하여 쓰기 트랜잭션(write transaction) 블록에서 데이터베이스에 Realm 객체 클래스의 인스턴스를 전달합니다.
realm.write(() { realm.add(Person(ObjectId(), 'Lando')); });
다중 객체 생성
데이터베이스에 여러 객체를 추가하려면 쓰기 트랜잭션(write transaction) 블록 내의 Realm.addAll()에 여러 객체 목록을 전달합니다.
realm.write(() { realm.addAll([ Person(ObjectId(), 'Figrin D\'an'), Person(ObjectId(), 'Greedo'), Person(ObjectId(), 'Toro') ]); });