android realm

Actualizar reino en un proyecto de Android



realm (2)

La actualización principal a Realm de 4+ a 5+ necesita cambiar de:

realm.where(example.class) .findAllSorted("field")

A:

realm.where(example.class) .sort("field") .findAll();

Actualmente estoy ejecutando Realm Version 0.82.0 en uno de mis proyectos de Android. No toqué Realm durante bastante tiempo, hasta que recientemente noté que subieron hasta la versión 2.0.2 mientras tanto. Me gustaría actualizar mi versión de Realm, desafortunadamente, no sé si la actualización de mi versión anterior a la versión actual funcionará o romperá mi código.

Estoy especialmente preocupado por las migraciones, ya que la API para las migraciones parece haber cambiado un poco desde mi código, y no estoy seguro de si mis migraciones se romperán si solo actualizo mi versión. Desafortunadamente, no hay documentación sobre la actualización de la versión Realm disponible en su página web.

¿Alguien tiene alguna experiencia con la actualización de Realm, especialmente un aumento de versión en dos versiones principales?


La lista de cambios importantes está disponible en CHANGELOG.MD en su Github.

Sin embargo, vale la pena señalar que hubo algunos cambios importantes en el camino, especialmente observando 0.89.0.

De 0.82.0 a 5.1.0 es la siguiente (que es la versión más estable en este momento):

0.82.0 :

CAMBIO DE INTERRUPCIÓN: los campos con la anotación @PrimaryKey se indexan automáticamente ahora. Los esquemas más antiguos requieren una migración.

(0.82.2 fue más estable aquí, pero no funcionó en dispositivos Blackberry. La primera versión estable que se usó en Blackberry fue 0.87.2).

En 0.86.0+, puede agregar un índice al campo anotado usando

@Override public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) { RealmSchema schema = realm.getSchema(); // version check and stuff RealmObjectSchema personSchema = schema.get("Person"); personSchema.addIndex("fieldName");

0,83 :

Cambio de última hora: actualización del formato de archivo de la base de datos. El archivo Realm creado por esta versión no puede ser utilizado por versiones anteriores de Realm.

CAMBIO DE ROMPER: Se eliminaron los métodos y constructores obsoletos de la clase Realm.

CAMBIO DE ROMPIMIENTO: Se introdujeron los tipos en caja Booleano, Byte, Corto, Entero, Largo, Flotante y Doble. Soporte nulo agregado. Anotación introducida @Required para indicar que un campo no es anulable. String, Date y byte [] se anulan de forma predeterminada, lo que significa que se generará una excepción RealmMigrationNeededException si se abre una versión anterior de un archivo Realm.

Oh chico, esta es buena. Soporte nulo.

Los tipos en caja para primitivas estuvieron disponibles. Los tipos en caja son anulables por defecto. Todas las String , la Date y el byte[] deben estar anotados con @Required , o schema.setNullable("fieldName", nullability) y hacerlos todos anulables.

0.84.0:

Se agregaron consultas asincrónicas. Nada nuevo aquí en términos de esquema.

0.85.0:

CAMBIO DE INTERRUPCIÓN: Se eliminó RealmEncryptionNotSupportedException ya que la implementación del cifrado cambió en el motor de almacenamiento subyacente de Realm. El cifrado ahora es compatible con todos los dispositivos.

CAMBIO DE INTERRUPCIÓN: Realm.executeTransaction () ahora lanza directamente cualquier RuntimeException en lugar de envolverlo en una RealmException (# 1682).

BREAKING CHANGE: RealmQuery.isNull () y RealmQuery.isNotNull () ahora lanzan IllegalArgumentException en lugar de RealmError si el nombre de campo es un campo vinculado y el último elemento es un enlace (# 1693).

Nada importante aquí todavía, aunque:

Los colocadores en el objeto administrado para RealmObject y RealmList ahora lanzan IllegalArgumentException si el valor contiene un objeto no válido (no administrado, eliminado, cerrado, de un Reino diferente) (# 1749).

Este es interesante. Anteriormente simplemente fallaba, así que esto es lo mejor. Pero también es la mayor limitación del Reino.

0.86.0 :

Cambio de última hora: la API de migración se ha reemplazado por una nueva API.

BREAKING CHANGE: RealmResults.SORT_ORDER_ASCENDING y RealmResults.SORT_ORDER_DESCENDING constantes se han reemplazado por las enumeraciones Sort.ASCENDING y Sort.DESCENDING.

BREAKING CHANGE: las constantes RealmQuery.CASE_SENSITIVE y RealmQuery.CASE_INSENSITIVE han sido reemplazadas por las enumeraciones Case.SENSITIVE y Case.INSENSITIVE.

BREAKING CHANGE: Realm.addChangeListener, RealmObject.addChangeListener y RealmResults.addChangeListener tienen una fuerte referencia al oyente, debe anular el registro del oyente para evitar pérdidas de memoria.

CAMBIO DE INTERRUPCIÓN: Se han eliminado los métodos obsoletos RealmQuery.minimum {Int, Float, Double}, RealmQuery.maximum {Int, Float, Double}, RealmQuery.sum {Int, Float, Double} y RealmQuery.average {Int, Float, Double}. Utilice RealmQuery.min (), RealmQuery.max (), RealmQuery.sum () y RealmQuery.average () en su lugar.

CAMBIO DE INTERRUPCIÓN: Se eliminó RealmConfiguration.getSchemaMediator () que es público por error. Y RealmConfiguration.getRealmObjectClasses () se agrega como alternativa para obtener el conjunto de clases de modelo (# 1797).

CAMBIO DE INTERRUPCIÓN: Realm.addChangeListener, RealmObject.addChangeListener y RealmResults.addChangeListener lanzará una IllegalStateException cuando se invoque en un subproceso que no sea Looper. Esto es para evitar registrar oyentes que no serán invocados.

Se agregó una nueva API dinámica utilizando DynamicRealm y DynamicRealmObject.

Se agregaron Realm.getSchema () y DynamicRealm.getSchema ().

La nueva API de migración, que utiliza DynamicRealm lugar de Realm.getTable() .

Se cambiaron el nombre de algunas cosas, y debe anular el registro de sus escuchas de cambio si su conjunto de resultados sigue siendo válido. Pero vale la pena señalar que aún debe conservar una variable de campo para sus RealmResults Realm, porque el Context de Realm solo tiene una referencia débil.

0.87.0 :

Soporte de RX. Nada importante.

0.87.2 :

Se eliminó la llamada explícita de GC al confirmar una transacción (# 1925).

¡Finalmente, Realm se estabilizó nuevamente! :)

0.88.0 :

Rompiendo cambios

Realm ahora debe instalarse como un complemento de Gradle.

DynamicRealm.executeTransaction () ahora arroja directamente cualquier RuntimeException en lugar de envolverlo en una RealmException (# 1682).

DynamicRealm.executeTransaction () ahora arroja IllegalArgumentException en lugar de aceptar silenciosamente un objeto Transaction nulo.

Los establecedores de cadenas ahora lanzan IllegalArgumentException en lugar de RealmError para sustitutos no válidos.

DynamicRealm.distinct () / distinctAsync () y Realm.distinct () / distinctAsync () ahora lanzan IllegalArgumentException en lugar de UnsupportedOperationException para un tipo no válido o un campo no indexado.

Todos los oyentes de cambios locales de subprocesos ahora se retrasan hasta el próximo evento de Looper en lugar de activarse al confirmar.

Se eliminó RealmConfiguration.getSchemaMediator () de la API pública que estaba en desuso en 0.86.0. Utilice RealmConfiguration.getRealmObjectClasses () para obtener el conjunto de clases modelo (# 1797).

Realm.migrateRealm () lanza una FileNotFoundException si el archivo Realm no existe.

Ahora es necesario darse de baja de todos los observables de Realm RxJava para cerrar completamente el Reino (# 2357).

Welp. Es un AAR ahora. classpath agregar a classpath y ejecutarlo con el apply plugin: ''realm-android'' lugar de compile ... dependencia.

Los oyentes de cambio solo se invocan en el siguiente ciclo de eventos, en lugar de inmediatamente después de la confirmación. Sinceramente, no estoy completamente seguro de las ramificaciones de esto, pero significa que los oyentes de cambio no funcionan en subprocesos en segundo plano. Solo en subprocesos looper (principalmente el subproceso de interfaz de usuario).

Mejoras

Soporte para métodos personalizados, lógica personalizada en accesores, nombres de accesor personalizados, implementación de interfaz y campos públicos en objetos Realm (# 909).

Mejorado .so cargando usando ReLinker.

Sin embargo, esto es bastante necesario, por lo que no me quiero quedar atascado en 0.87.5 con seguridad.

0.89.0:

Rompiendo cambios

El valor del campo @PrimaryKey ahora puede ser nulo para los tipos String, Byte, Short, Integer y Long. Los Reinos más antiguos deben migrarse, usando RealmObjectSchema.setNullable (), o agregando la anotación @Required. (# 2515).

RealmResults.clear () ahora arroja UnsupportedOperationException. Utilice RealmResults.deleteAllFromRealm () en su lugar.

RealmResults.remove (int) ahora arroja UnsupportedOperationException. Utilice RealmResults.deleteFromRealm (int) en su lugar.

RealmResults.sort () y RealmList.sort () ahora devuelven el resultado ordenado en lugar de ordenar en el lugar.

RealmList.first () y RealmList.last () ahora lanzan ArrayIndexOutOfBoundsException si RealmList está vacío.

Se eliminó el método obsoleto Realm.getTable () de la API pública.

Realm.refresh () y DynamicRealm.refresh () en un Looper ya no tienen ningún efecto. RealmObject y RealmResults siempre se actualizan en el siguiente bucle de eventos.

Bien, este es el más desordenado.

1.) debe agregar la anotación @Required para los campos anotados @PrimaryKey , porque null es un valor de clave principal válido.

2.) realm.refresh() ya no funciona. Será eliminado de todos modos. Sin embargo, aquí hay una solución para 1.1.1 , debe usarse solo en subprocesos en segundo plano. Sin embargo, está disponible en Realm 3.2 nuevamente.

3.) getTable() se elimina. No lo uses Use la nueva API de migración.

4.) realmResults.sort() devuelve un nuevo RealmResults, que también necesita que se agregue el detector de cambios. Creo que no es confiable, así que solo usaría findAllSorted() lugar.

5.) Puede que no pienses mucho en eso, pero

RealmObject y RealmResults siempre se actualizan en el siguiente bucle de eventos. ( NOTA: ESTO NO ES VERDAD DESDE EL REINO 3.1+ DONDE SE LLAMAN DE NUEVO LOS commitTransaction() DE commitTransaction() EN commitTransaction() )

Esto literalmente significaba que RealmResults solo se actualizaban cuando RealmResults el bucle de eventos, NO se actualizaba inmediatamente cuando llamaba a realm.commitTransaction() . Esto también significa que en subprocesos en segundo plano, RealmResults NO se actualizó cuando commitTransaction() , tuvo que volver a consultarlos.

RealmResults solo se sabe que se actualiza después de que se llama RealmChangeListener adjunto. En 1.1.1, cuando se llama a RealmChangeListener , todos los resultados se han actualizado.

Sin embargo, este cambio también cambió el comportamiento de iteración en las transacciones. En las transacciones, siempre viste la versión más nueva. Esto significaba que una consulta se reevaluaba a medida que la iteraba y modificaba elementos. ( ESTE ES TAMBIÉN EL CASO DESDE EL REINO 3.0 )

Ejemplo, anteriormente este era un código válido:

RealmResults<Stuff> stuffs = realm.where(Stuff.class).equalTo("something", false).findAll(); while(!stuffs.isEmpty()) { stuffs.get(0).setSomething(true); } // you end up here because stuffs will be empty // because of live auto-updates in transactions

Sin embargo, esto ya no funcionará. Para mí, esto causó problemas porque a veces repetía así

RealmResults<Stuff> stuffs = realm.where(Stuff.class).equalTo("something", false).findAll(); for(int i = 0; i < stuffs.size(); i++) { stuffs.get(i--).setSomething(true); } // I end up here because of live auto-updates

Esto es un problema, porque las stuffs ya no cambiarán. Tuve que hacer una búsqueda en mi código y corregir todas las iteraciones como esta.

La solución oficial solía ser esta:

RealmResults<Stuff> stuffs = realm.where(Stuff.class).equalTo("something", false).findAll(); for(int i = stuffs.size()-1; i >= 0; i--) { stuffs.get(i).setSomething(true); } // I end up here because of normal iteration

Esto todavía funcionaría bien en 0.89.0.

Desde 0.89.0, este también es un código válido ( y en 3.0.0+, esto crea automáticamente una colección de instantáneas ):

RealmResults<Stuff> stuffs = realm.where(Stuff.class).equalTo("something", false).findAll(); for(Stuff stuff : stuffs) { stuff.setSomething(true); }

Sin embargo, los elementos en los resultados aún se invalidan, pero los resultados en sí mismos no cambian. (Esto es lo mismo para las colecciones de instantáneas también en Realm 3.0.0+).

0.90.0:

Rompiendo cambios

RealmChangeListener también proporciona el objeto modificado / Realm / collection (# 1594).

Todos los métodos JSON en Realm ahora solo envuelven JSONException en RealmException. Todas las demás excepciones se lanzan tal como están.

Marcó todos los métodos en RealmObject y todas las clases públicas finales (# 1594).

Se eliminó BaseRealm de la API pública.

Se eliminó HandlerController de la API pública.

Se eliminó el constructor de RealmAsyncTask de la API pública (# 1594).

RealmBaseAdapter se ha trasladado a su propio repositorio de GitHub: https://github.com/realm/realm-android-adapters

Se cambia el formato de archivo de los archivos Realm. Los archivos se actualizarán automáticamente, pero no es posible abrir un archivo Realm con versiones anteriores de Realm.

Entonces RealmBaseAdapter ahora está en realm-android-adapters , para 1.1.1 de Realm, use 1.3.0 . También agrega RealmRecyclerViewAdapter . Para 3.5.0 , use 2.0.0 o más reciente.

RealmChangeListeners tiene un parámetro de element . Hurra.

Además, la fecha ahora tiene milisecond precisión de milisecond .

0.91.0:

Rompiendo cambios

Se eliminaron todos los métodos @Deprecated.

Al llamar a Realm.setAutoRefresh () o DynamicRealm.setAutoRefresh () desde un subproceso que no es Looper, se produce IllegalStateException incluso si el autoRefresh es falso (# 2820).

En desuso muchos métodos en 0.90.0, entonces

Cambios de última hora:

Realm.allObjects * (). Utilice Realm.where (clazz) .findAll * () en su lugar.

Reino.distinct * (). Utilice Realm.where (clazz) .distinct * () en su lugar.

DynamicRealm.allObjects * (). Utilice DynamicRealm.where (className) .findAll * () en su lugar.

DynamicRealm.distinct * (). Utilice DynamicRealm.where (className) .distinct * () en su lugar.

Realm.allObjectsSorted (campo, ordenación, campo, ordenación, campo, ordenación). Utilice RealmQuery.findAllSorted (campo [], ordenar []) `en su lugar.

RealmQuery.findAllSorted (campo, ordenación, campo, ordenación, campo, ordenación). Utilice RealmQuery.findAllSorted (campo [], ordenar []) `en su lugar.

RealmQuery.findAllSortedAsync (campo, ordenación, campo, ordenación, campo, ordenación). Utilice RealmQuery.findAllSortedAsync (campo [], ordenar []) `en su lugar.

RealmConfiguration.setModules (). Utilice RealmConfiguration.modules () en su lugar.

Realm.refresh () y DynamicRealm.refresh (). Utilice Realm.waitForChange () / stopWaitForChange () o DynamicRealm.waitForChange () / stopWaitForChange () en su lugar.

waitForChange() realmente no funciona, ya que la gente tiene la intención de usarlo, así que aquí hay una solución alternativa para 1.1.1 a 3.1.4 , aunque solo debe usarse en subprocesos en segundo plano. refresh() se volverá a agregar en 3.2.0.

Además, en algún momento se Realm.getInstance(Context) , use Realm.getInstance(new RealmConfiguration.Builder(Context).build()) lugar.

Después de eso, llegó 1.0.0, así que es más o menos eso.

Por cierto, en 1.1.0, se agregó copyToRealmOrUpdate() , que es más rápido que copyToRealmOrUpdate() y no devuelve un proxy.

2.0.2 :

  • Las claves primarias son inmutables en los objetos administrados, una vez que se establece, no se puede cambiar y arroja una excepción si lo intenta. Además, use realm.createObject(clazz, primaryKeyValue) si usa createObject() para crear objetos.

  • Debe llamar a Realm.init(Context) en algún momento.

  • Configuration Builder ya no recibe contexto.

  • armeabi ya no es compatible. (solo v7a y los demás)

No hay cambios de última hora hasta 3.0.0, pero un montón de correcciones de errores.

3.0.0:

RealmResults.distinct () devuelve un nuevo objeto RealmResults en lugar de filtrar en el objeto original (# 2947).

RealmResults se actualiza automáticamente de forma continua. Cualquier transacción en el subproceso actual que pueda tener un impacto en el orden o los elementos de RealmResults cambiará RealmResults inmediatamente en lugar de cambiarlo en el siguiente bucle de eventos. El RealmResults.iterator () estándar continuará funcionando normalmente, lo que significa que aún puede eliminar o modificar elementos sin afectar el iterador. Lo mismo no es cierto para simples bucles for. En algunos casos, un bucle for simple no funcionará ( https://realm.io/docs/java/3.0.0/api/io/realm/OrderedRealmCollection.html#loops ), y debe usar el nuevo createSnapshot () método.

RealmChangeListener en RealmObject ahora también se activará cuando se elimine el objeto. Use RealmObject.isValid () para verificar este estado (# 3138). RealmObject.asObservable () ahora emitirá el objeto cuando se elimine. Use RealmObject.isValid () para verificar este estado (# 3138).

Se eliminaron las clases obsoletas Logger y AndroidLogger (# 4050).

Debido a la integración de Realm ObjectStore Results, RealmResults está vivo nuevamente en las transacciones, al igual que en 0.88.3 y anteriores.

Tan simple for loops (indexar con for(int i = 0; ... ) es propenso a romperse, lo que significa que debe invertirlos o crear primero una colección de instantáneas.

OrderedRealmCollection<Thing> snapshot = results.createSnapshot(); for(int i = 0; i < snapshot.size(); i++) { ...

Además, el RealmObject cambios RealmObject ahora también se emitirá al eliminarlo, debe verificar isValid() en el detector de cambios. Esto es para que pueda actualizar la IU si el objeto se ha eliminado en segundo plano.

3.1.0:

Formato de archivo actualizado de archivos Realm. Los archivos de Realm existentes se migrarán automáticamente al nuevo formato cuando se abran, pero las versiones anteriores de Realm no pueden abrir estos archivos.

Nada que hacer aquí, pero vale la pena mencionarlo.

3.2.0-3.2.1:

No hay nada que hacer aquí, excepto actualizar proguard, porque hubo un error introducido aquí. Se agregó la sección de protección.

3.3.0: (y 3.3.1)

No hay nada que hacer aquí, se solucionó el error que causó el problema de Proguard en 3.2.0.

3.4.0:

No hay nada que hacer aquí, aunque vale la pena mirar la nueva API @LinkingObjects para relaciones inversas.

De hecho, se recomienda reemplazar los enlaces bidireccionales con un enlace unidireccional + relación inversa.

3.5.0:

Rompiendo cambios

Se lanzará una IllegalStateException si el RealmModule dado no incluye todas las clases de modelo requeridas (# 3398).

Si no ha especificado todos los RealmObjects en los modules() (en caso de que use varios módulos en lugar de solo los predeterminados, por ejemplo, RealmObjects de un proyecto de biblioteca), debe asegurarse de proporcionar realmente todos los RealmObjects que son parte de El esquema en sus módulos.

Anteriormente los agregaba silenciosamente incluso si no estaban en los módulos, ahora ese no es el caso.

4.0.0:

Rompiendo cambios

El formato de archivo interno ha sido actualizado. Al abrir un Realm anterior, el archivo se actualizará automáticamente, pero las versiones anteriores de Realm ya no podrán leer el archivo.

[ObjectServer] Se actualizó la versión del protocolo a 22, que solo es compatible con Realm Object Server> = 2.0.0.

[ObjectServer] Se eliminaron las API obsoletas SyncUser.retrieveUser () y SyncUser.retrieveUserAsync (). Utilice SyncUser.retrieveInfoForUser () y retrieveInfoForUserAsync () en su lugar.

[ObjectServer] SyncUser.Callback ahora acepta un parámetro genérico que indica el tipo de objeto devuelto cuando se llama a onSuccess.

[ObjectServer] Renombrado SyncUser.getAccessToken a SyncUser.getRefreshToken.

[ObjectServer] Se eliminó la API obsoleta SyncUser.getManagementRealm ().

Llamar a distinct () en un RealmResults ordenado ya no borra ninguna clasificación definida (# 3503).

Límite superior relajado del parámetro tipo de RealmList, RealmQuery, RealmResults, RealmCollection, OrderedRealmCollection y OrderedRealmCollectionSnapshot.

Realm ha actualizado su soporte RxJava1 a RxJava2 (# 3497) Realm.asObservable () ha cambiado su nombre a Realm.asFlowable (). RealmList.asObservable () ha cambiado de nombre a RealmList.asFlowable (). RealmResults.asObservable () ha cambiado de nombre a RealmResults.asFlowable (). RealmObject.asObservable () ha cambiado de nombre a RealmObject.asFlowable (). RxObservableFactory ahora devuelve los tipos RxJava2 en lugar de los tipos RxJava1.

Se eliminaron las API obsoletas RealmSchema.close () y RealmObjectSchema.close (). Esos ya no tienen que ser llamados.

Se eliminó la API obsoleta RealmResults.removeChangeListeners (). Utilice RealmResults.removeAllChangeListeners () en su lugar.

Se eliminó la API obsoleta RealmObject.removeChangeListeners (). Utilice RealmObject.removeAllChangeListeners () en su lugar.

Eliminado UNSUPPORTED_TABLE, UNSUPPORTED_MIXED y UNSUPPORTED_DATE de RealmFieldType.

Se eliminó la API obsoleta RealmResults.distinct () / RealmResults.distinctAsync (). Utilice RealmQuery.distinct () / RealmQuery.distinctAsync () en su lugar.

RealmQuery.createQuery (Realm, Class), RealmQuery.createDynamicQuery (DynamicRealm, String), RealmQuery.createQueryFromResult (RealmResults) y RealmQuery.createQueryFromList (RealmList) se han eliminado. Utilice Realm.where (Class), DynamicRealm.where (String), RealmResults.where () y RealmList.where () en su lugar.

Por lo tanto, la compatibilidad con Rx1 se reemplazó por la compatibilidad con Rx2, y se removeChangeListeners() nombre de removeAllChangeListeners() por removeAllChangeListeners() .

La mayoría de las otras cosas solo afectan a los Reinos de sincronización, y desde este punto es posible usar RealmList<String> , RealmList<Date> y RealmList<Integer> como parte del esquema de Realm. Aún no se admite su consulta, y no se completan con los métodos create*FromJson .

4.3.1:

Obsoleto

RealmQuery.findAllSorted () y RealmQuery.findAllSortedAsync () a favor del predicado RealmQuery.sort (). FindAll ().

RealmQuery.distinct () y RealmQuery.distinctAsync () a favor del predicado RealmQuery.distinctValues ​​(). FindAll ()

En lugar de usar realm.where(Blah.class).distinct("something") o realm.where(Blah.class).findAllSorted("something") , ahora puede hacer

realm.where(Blah.class) .distinctValues("something") // subject to change to `distinct()` .sort("something") // hopefully will change to `sorted()`? // nope, it''s `sort` .findAll();

5.0.0:

Renombrado RealmQuery.distinctValues ​​() a RealmQuery.distinct ()

Se eliminó RealmQuery.findAllSorted (), RealmQuery.findAllSortedAsync () RealmQuery.distinct () yRealmQuery.distinctAsync () `.

El parámetro OrderedCollectionChangeSet en OrderedRealmCollectionChangeListener.onChange () ya no es anulable. Use changeSet.getState () en su lugar (# 5619).

Esto significa que realm.where(...).findAllSorted("field") debe ser realm.where(...).sort("field").findAll() .

También viene que OrderedRealmCollectionChangeListener solía enviar null como el conjunto de cambio inicial, ahora que ya no es el caso, y == null debe reemplazarse con .getState() == OrderedCollectionChangeSet.State.INITIAL . Esto también significa que debe usar realm-android-adapters 3.0.0 o posterior con Realm 5.0+.

Además, si confió en los nombres de __RealmProxy clases __RealmProxy : se nombran por su nombre completo, incluidos los paquetes, como my_package_SomeObjectRealmProxy .

NORMAS DE PROGUARDO

#realm older than 0.84.1 -keepnames public class * extends io.realm.RealmObject -keep @io.realm.annotations.RealmModule class * -keep class io.realm.** { *; } -dontwarn javax.** -dontwarn io.realm.** #realm 0.84.1+ and older than 1.0.0 -keep class io.realm.annotations.RealmModule -keep @io.realm.annotations.RealmModule class * -keep class io.realm.internal.Keep -keep @io.realm.internal.Keep class * -dontwarn javax.** -dontwarn io.realm.** #realm 0.89.0+ and older than 1.0.0 -keep class io.realm.RealmCollection -keep class io.realm.OrderedRealmCollection #realm 3.2.0 and 3.2.1 -keepnames public class * extends io.realm.RealmObject