Cómo deserializar una subclase en Firebase usando getValue (Subclass.class)
Estoy usando la nueva firebase sdk para android y uso la función de base de datos real. Cuando uso el getValue(simple.class)
todo está bien. Pero cuando quiero analizar una clase que es una subclase, todo el atributo de la clase madre es null
, y tengo este tipo de error:
No setter / field para el nombre encontrado en la clase uk.edume.edumeapp.TestChild
public class TestChild extends TestMother { private String childAttribute; public String getChildAttribute() { return childAttribute; } } public class TestMother { protected String motherAttribute; protected String getMotherAttribute() { return motherAttribute; } }
esta función
snapshot.getValue(TestChild.class);
motherAttribute
atributo motherAttribute
es null
, y obtengo
No setter / field para motherAttribute encontrado en la clase uk.edume.edumeapp.TestChild
El Json que analizo es:
{ "childAttribute" : "attribute in child class", "motherAttribute" : "attribute in mother class" }
- UDP Multicasting desde el móvil a la PC
- Búsqueda de diseños por ID
- Android: compás + distancia en una vista de lista
- ¿Cómo utilizar textview en la pantalla de Preferencias de Android?
- ¿Qué es una buena práctica para combinar sus clases?
- Problema de compilación de Gradle: actualización de Quickblox y httpclient en el último SDK23 de Android
- Cómo agregar una vista a la parte superior de un diseño lineal en el código?
- Android appCompat problema con samsung y wiko
Firebaser aquí
Este es un error conocido en algunas versiones del SDK de base de datos de Firebase para Android: nuestro serializador / deserializador sólo considera propiedades / campos en la clase declarada.
Serialización de propiedades heredadas de la clase base, falta en las versiones 9.0 a 9.6 (iirc) del SDK de base de datos Firebase para Android. Fue agregado de nuevo en versiones desde entonces.
Solución
Mientras tanto, puede utilizar Jackson (que los SDK de Firebase 2.x utilizan bajo el capó) para hacer que el modelo de herencia funcione.
Actualización : aquí hay un fragmento de cómo puede leer de JSON en su TestChild
:
public class TestParent { protected String parentAttribute; public String getParentAttribute() { return parentAttribute; } } public class TestChild extends TestParent { private String childAttribute; public String getChildAttribute() { return childAttribute; } }
getParentAttribute()
que he hecho getParentAttribute()
público, porque solo se consideran los campos / getters públicos. Con ese cambio, este JSON:
{ "childAttribute" : "child", "parentAttribute" : "parent" }
Se puede leer con:
ObjectMapper mapper = new ObjectMapper(); GenericTypeIndicator<Map<String,Object>> indicator = new GenericTypeIndicator<Map<String, Object>>() {}; TestChild value = mapper.convertValue(dataSnapshot.getValue(indicator), TestChild.class);
El GenericTypeIndicator
es un poco raro, pero afortunadamente es un encantamiento mágico que puede ser copiado / pegado.
Esto aparentemente fue finalmente fijado en la versión 9.6 .
Corregido un problema en el que pasar una clase derivada a DatabaseReference # setValue () no guardó correctamente las propiedades de la superclase.
para:
No setter / field para motherAttribute encontrado en la clase uk.edume.edumeapp.TestChild
Poner setter para la clase TestChild:
public class TestMother { private String motherAttribute; public String getMotherAttribute() { return motherAttribute; } //set public void setMotherAttribute(String motherAttribute) { this.motherAttribute= motherAttribute; } }
Consulta esta https://firebase.google.com/support/guides/firebase-android
dice
"Si hay una propiedad adicional en su JSON que no está en su clase Java, verá esta advertencia en los archivos de registro: W / ClassMapper: No setter / field para ignoreThisProperty encontrado en la clase com.firebase.migrationguide.ChatMessage"
Blockquote
Puedes deshacerte de esta advertencia poniendo una anotación @IgnoreExtraProperties en tu clase. Si desea que la base de datos Firebase se comporte como en el SDK 2.x y lance una excepción si hay propiedades desconocidas, puede poner una anotación @ThrowOnExtraProperties en su clase.
Blockquote
- Android: ¿Cómo pausar y reanudar un temporizador de cuenta atrás?
- ¿Cómo puedo encontrar la carpeta de imágenes de la cámara de un teléfono Android?