Arquitetura congelada - Kotlin SDK
Ao contrário dos outros Realm SDKs, o Kotlin SDK não fornece objetos ativos e coleções que são atualizados simultaneamente com os dados subjacentes. Em vez disso, o Kotlin SDK funciona exclusivamente com objetos congelados que podem ser passados entre threads com segurança.
Trabalhe com objetos congelados
Como os objetos congelados não são atualizados automaticamente quando os dados são alterados em seu domínio, eles funcionam um pouco diferente dos objetos ativos que você pode ter usado em outros SDKs do Realm.
Acesse uma versão ao vivo do objeto congelado
Para atualizar ou excluir objetos, eles devem estar ativos. Você pode converter um objeto congelado em um objeto ativo em uma transação com mutableRealm.findLatest(). Objetos ativos só são acessíveis dentro de uma transação de gravação dentro de um fechamento de escrita ou writeBlocking .
Objetos retornados de um fechamento de gravação se tornam objetos congelados quando a transação de gravação é concluída.
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) } } }
Dica
Você pode verificar se um objeto está congelado usando o método isFrozen().
Realms seguros para threads
A classe Realm não é mais confinada por threads, então você pode compartilhar um único Realm em várias threads. Você não precisa mais lidar com o ciclo de vida do Realm explicitamente com chamadas para Realm.close().
Alterações de acesso
Para acessar alterações em objetos e coleções, use Coroutines e a API de fluxo . As alterações são seguras para threads, para que você possa acessá-las de qualquer contexto. As notificações são tratadas em uma thread de notificação interna dedicada. Objetos congelados agora suportam ouvintes de alteração.
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"}) } }
Importante
A API de fluxos requer corrotinas do Kotlinx
Para usar a API de fluxos em seu projeto Kotlin Multiplatform, instale kotlinx.coroutines biblioteca.
Assim como em outros SDKs do Realm , escreva transações implicitamente para avançar seu Realm para a versão mais recente dos dados armazenados em disco.
Carregamento lento
Os objetos de Realm ainda são carregados lentos por padrão. Isso permite consultar grandes coleções de objetos sem ler grandes quantidades de dados do disco. Isso também significa que o primeiro acesso a um campo de um objeto sempre retornará os dados mais recentes.