동결 아키텍처 - 코틀린 SDK (Kotlin SDK)
다른 Realm SDK와 달리 코틀린 SDK (Kotlin SDK) 는 기본 데이터와 동시에 업데이트 되는 라이브 객체 및 컬렉션을 제공하지 않습니다. 대신 코틀린 SDK ( 코틀린 SDK (Kotlin SDK) )는 스레드 간에 안전하게 전달할 수 있는 동결된 객체 에만 독점적으로 작동합니다.
동결된 객체로 작업하기
동결된 객체는 Realm의 데이터가 변경될 때 자동으로 업데이트되지 않기 때문에 다른 Realm SDK에서 사용했을 수 있는 라이브 객체와 약간 다르게 작동합니다.
동결된 객체의 라이브 버전에 액세스
객체를 업데이트 하거나 삭제 객체가 라이브 상태여야 합니다. mutableRealm.findLatest() 를 사용하여 트랜잭션 에서 동결된 객체 를 라이브 객체 로 변환할 수 있습니다. 라이브 객체는 쓰기 (write) 또는 쓰기 차단( writeBlocking) 클로저 내의 쓰기 트랜잭션 (write transaction) (write transaction) 내에서만 액세스할 수 있습니다.
쓰기 (write) 클로저에서 반환된 객체는 쓰기 트랜잭션( 쓰기 트랜잭션 (write transaction) )이 완료되면 동결된 객체가 됩니다.
val sample: Sample? = realm.query<Sample>() .first().find() // delete one object synchronously realm.writeBlocking { if (sample != null) { findLatest(sample) ?.also { delete(it) } } } // delete a query result asynchronously GlobalScope.launch { realm.write { query<Sample>() .first() .find() ?.also { delete(it) } } }
팁
객체가 고정되었는지 여부는 isFrozen() 메서드를 사용하여 확인할 수 있습니다.
스레드로부터 안전한 Realm
Realm 클래스는 더 이상 스레드에 한정되지 않으므로 여러 스레드에서 단일 영역 을 주식 할 수 있습니다. 더 이상 Realm 영역 ( )를 호출하여 Realm 수명 주기를 명시적으로 처리하다 할 필요가 없습니다.
액세스 변경 사항
객체 및 컬렉션의 변경 사항에 액세스 하려면 코루틴 을 사용합니다. 및 Flow API . 변경 사항은 스레드로부터 안전하므로 모든 컨텍스트에서 액세스 할 수 있습니다. 알림은 전용 내부 알림 스레드에서 처리됩니다. 이제 고정된 객체가 변경 리스너를 지원 합니다.
val config = RealmConfiguration.Builder(schema = setOf(Task::class)) .build() val realm = Realm.open(config) // fetch objects from a realm as Flowables CoroutineScope(Dispatchers.Main).launch { val flow: Flow<ResultsChange<Task>> = realm.query<Task>().asFlow() flow.collect { task -> Log.v("Task: $task") } } // write an object to the realm in a coroutine CoroutineScope(Dispatchers.Main).launch { realm.write { copyToRealm(Task().apply { name = "my task"; status = "Open"}) } }
중요
Flows API 에는 Kotlinx 코루틴이 필요합니다.
코틀린(코틀린 (Kotlin) ) 멀티플랫폼 프로젝트 에서 Flows API 를 사용하려면 kotlinx.coroutines 파일 을 설치하세요. 라이브러리.
다른 Realm SDK와 마찬가지로 쓰기 (write) 트랜잭션(write transaction)은 암시적으로 영역 을 디스크에 저장된 최신 버전의 데이터로 진행합니다.
지연 로딩
Realm 객체는 여전히 기본값 지연 로드됩니다. 이를 통해 디스크에서 많은 양의 데이터를 읽지 않고도 대규모 객체 컬렉션을 쿼리 할 수 있습니다. 이는 또한 객체 의 필드 에 처음 액세스 하면 항상 가장 최근의 데이터가 반환된다는 의미이기도 합니다.