No se pueden recuperar los valores de campo del objeto de reino, los valores son nulos en el depurador

Parece que mis valores de RealmObject están siendo ocultados por la clase RealmProxy, pero se pueden configurar desde la clase de proxy.

Mi modelo es bastante sencillo, como puedes ver.

public class GroupRealm extends RealmObject { @PrimaryKey public String id; @Index public String name; public String imageUrl; public int order; public GroupRealm parent; public RealmList children; public RealmList contents; } 

Así es como estoy estableciendo los valores (db es un Reino válido, y todo está en una transacción que se compromete bien):

 GroupRealm gr = db.where(GroupRealm.class).equalTo("id",g.GroupID).findFirst(); if(gr==null){ gr = db.createObject(GroupRealm.class,g.GroupID); } gr.imageUrl = g.GlyphUrl; gr.name = g.Title; gr.order = g.OrderNum; 

La imagen de abajo es lo que obtengo cuando consulto el db último encendido. (Mismo nombre de variable no es el mismo lugar en el código)

RealmObject tiene valores RealmProxyClass no

En mi android.library, donde mi proyecto RealmObjects está definido, tengo los complementos necesarios.

 apply plugin: 'com.android.library' apply plugin: 'realm-android' 

y en el nivel del proyecto estoy configurando las dependencias correctas:

 dependencies { classpath 'com.android.tools.build:gradle:2.1.0' classpath "io.realm:realm-gradle-plugin:0.90.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } 

Se me acabaron las ideas. Si trato de acceder a cualquier cosa, recupero GroupRealm como se esperaba, ¡pero todas las propiedades públicas expuestas a través de la clase proxy devuelven null!

Preguntas frecuentes relevantes en la documentación: https://realm.io/docs/java/latest/#debugging


Realm usa Android Gradle Transform API. Da la posibilidad de manipular los archivos de clase comstackdos antes de que se conviertan a archivos dex.
Más detalles en io.realm.transformer.RealmTransformer y io.realm.transformer. Clases BytecodeModifier que se pueden encontrar en el dominio github.

Lo que RealmTransformer hace, entre otros, es:

  • reemplazando todos los accesos a los campos de RealmObjects del usuario con los accesos de dominio apropiados.

También puede verificar las clases de resultados dentro de la aplicación de carpeta / build / intermedios / transformaciones / RealmTransformer /

Ejemplo de setter:
Línea de tu código:

 gr.imageUrl = g.GlyphUrl; 

será reemplazado con algo como esto:

 String var5 = g.GlyphUrl; gr.realmSet$imageUrl(var5); 

Ejemplo de getter:

 String url = gr.imageUrl; 

será reemplazado con algo como esto:

 String url = gr.realmGet$imageUrl(); 

Ejemplo de caso de uso

  1. Has creado la clase GroupRealm . El reino que usa Transform API genera GroupRealmRealmProxy . Esta clase proxy se ve así:

     public class GroupRealmRealmProxy extends GroupRealm implements RealmObjectProxy, GroupRealmRealmProxyInterface { private final GroupRealmRealmProxy.GroupRealmColumnInfo columnInfo; private final ProxyState proxyState; private RealmList childrenRealmList; private RealmList contentsRealmList; private static final List FIELD_NAMES; GroupRealmRealmProxy(ColumnInfo columnInfo) { ... } public String realmGet$id() { this.proxyState.getRealm$realm().checkIfValid(); return this.proxyState.getRow$realm().getString(this.columnInfo.idIndex); } public void realmSet$id(String value) { this.proxyState.getRealm$realm().checkIfValid(); if(value == null) { this.proxyState.getRow$realm().setNull(this.columnInfo.idIndex); } else { this.proxyState.getRow$realm().setString(this.columnInfo.idIndex, value); } } public String realmGet$name() { this.proxyState.getRealm$realm().checkIfValid(); return this.proxyState.getRow$realm().getString(this.columnInfo.nameIndex); } public void realmSet$name(String value) { this.proxyState.getRealm$realm().checkIfValid(); if(value == null) { this.proxyState.getRow$realm().setNull(this.columnInfo.nameIndex); } else { this.proxyState.getRow$realm().setString(this.columnInfo.nameIndex, value); } } ... } 

    Puede observar que los métodos realmSet $ ​​name y realmGet $ name no tienen acceso al nombre de campo declarado en la clase GroupRealm. Usan proxyState .

  2. Ahora, volvamos al uso de GroupRealm. Cuando depura tu código:

     GroupRealm gr = db.where(GroupRealm.class).equalTo("id",g.GroupID).findFirst(); if(gr==null){ gr = db.createObject(GroupRealm.class,g.GroupID); } gr.imageUrl = g.GlyphUrl; gr.name = g.Title; gr.order = g.OrderNum; 

    en realidad, su versión descomstackda tiene este aspecto:

     GroupRealm gr = (GroupRealm)realm.where(GroupRealm.class).equalTo("id", g.GroupId).findFirst(); if(gr == null) { gr = (GroupRealm)realm.createObject(GroupRealm.class, g.GroupId); } String var7 = g.GlyphUrl; gr.realmSet$imageUrl(var7); var7 = g.Title; gr.realmSet$name(var7); int var8 = g.OrderNum; gr.realmSet$order(var8); 

    En primer lugar, gr es la instancia de la clase GroupRealmRealmProxy . Como puede ver, la configuración de gr.name se reemplaza por gr.realmSet $ ​​name (var7) . Significa que el nombre de campo de GroupRealm nunca se usa. La situación es análoga en el caso de realmGet $ .

Mientras realiza la depuración, verá su versión del código fuente, pero en realidad está utilizando una versión modificada con los métodos inyectados realmSet $ y realmGet $ .

Los campos son nulos. Usted accede a las propiedades a través de un método nativo que reemplaza todo el acceso de campo. Anteriormente (antes de 0.88.0) solía crear un proxy dynamic que anulaba sus getters y setters para usar su implementación de proxy nativo.

Los campos no tienen valores. Pero como puede ver, el objeto Realm tiene los valores muy bien: lo dice en el valor toString ().

No hay nada que hacer al respecto. Debido a lo “inteligente” que Realm está haciendo, el depurador se ve completamente impedido de hacer lo que se supone que debe hacer. Tendrá que confiar en muchas declaraciones Log.d.

Lo siento. Esa es solo la realidad de eso.