Wie man eine Unterklasse in Firebase mit getValue (Subclass.class) deserialisieren kann

Ich benutze die neue Firebase-Sdk für Android und benutze die echte Datenbank-Funktion. Wenn ich den getValue(simple.class) alles in Ordnung. Aber wenn ich eine Klasse analysieren will, die eine Unterklasse ist, sind alle Attribute der Mutterklasse null , und ich habe diese Art von Fehler:

Kein Setter / Feld für den Namen gefunden auf der Klasse uk.edume.edumeapp.TestChild

  • Wie man Maven zu einem vorhandenen IntelliJ Android-Projekt hinzufügt
  • Häufige Probleme in der Android-Ansicht, Fehler beim Analysieren von XML: ungebundenes Präfix
  • Ideen für die Automatisierung von Android Monkey läuft
  • (Dynamisch) Mehrere Spinner Zustand / Stadt
  • RecyclerView schneidet den letzten Artikel ab
  • Wie kann ich ein Objekt serialisieren und es in einer Datei in Android speichern?
  •  public class TestChild extends TestMother { private String childAttribute; public String getChildAttribute() { return childAttribute; } } public class TestMother { protected String motherAttribute; protected String getMotherAttribute() { return motherAttribute; } } 

    Diese Funktion

     snapshot.getValue(TestChild.class); 

    motherAttribute Attribut ist null , und ich bekomme

    Kein Setter / Feld für motherAttribute gefunden auf Klasse uk.edume.edumeapp.TestChild

    Der Json, den ich analysiere, ist:

     { "childAttribute" : "attribute in child class", "motherAttribute" : "attribute in mother class" } 

  • Verwenden von benutzerdefinierten Debug Keys in Intellij IDEA 10 Community Ed
  • ADT 22.2 Neuer App-Assistent: Nicht unterstützte Template-Abhängigkeit: Aktualisieren Sie Ihr Android Eclipse-Plugin
  • Android: Wie man eine "laufende" Benachrichtigung erstellt?
  • Vertikale DrawerLayout oder SlidingPaneLayout
  • Android Youtube API verfügbar?
  • Open Source Bibliotheken Attribution in Android Apps
  • 4 Solutions collect form web for “Wie man eine Unterklasse in Firebase mit getValue (Subclass.class) deserialisieren kann”

    Firebaser hier

    Dies ist ein bekannter Fehler in einigen Versionen des Firebase Database SDK für Android: Unser Serializer / Deserializer berücksichtigt nur Eigenschaften / Felder auf der deklarierten Klasse.

    Serialisierung von vererbten Eigenschaften aus der Basisklasse fehlt in den Freigaben 9.0 bis 9.6 (iirc) des Firebase Database SDK für Android. Es wurde in den Versionen seitdem wieder hinzugefügt.

    Umgehung

    In der Zwischenzeit kannst du Jackson benutzen (was die Firebase 2.x SDKs unter der Kapuze benutzt), um das Vererbungsmodell zu machen.

    Update : Hier ist ein Ausschnitt, wie du von JSON in dein TestChild lesen 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; } } 

    Sie werden beachten, dass ich getParentAttribute() öffentlich gemacht habe, da nur öffentliche Felder / Getter berücksichtigt werden. Mit dieser Änderung, diese JSON:

     { "childAttribute" : "child", "parentAttribute" : "parent" } 

    Wird lesbar mit:

     ObjectMapper mapper = new ObjectMapper(); GenericTypeIndicator<Map<String,Object>> indicator = new GenericTypeIndicator<Map<String, Object>>() {}; TestChild value = mapper.convertValue(dataSnapshot.getValue(indicator), TestChild.class); 

    Der GenericTypeIndicator ist ein bisschen komisch, aber zum Glück ist es eine magische Beschwörung, die kopiert / eingefügt werden kann.

    Dies wurde offensichtlich endgültig in Release 9.6 behoben.

    Ein Problem wurde behoben, bei dem eine abgeleitete Klasse an DatabaseReference # setValue () übergeben wurde, die Eigenschaften der Superklasse nicht korrekt gespeichert haben.

    zum:

    Kein Setter / Feld für motherAttribute gefunden auf Klasse uk.edume.edumeapp.TestChild

    Setzer für TestChild Klasse setzen:

      public class TestMother { private String motherAttribute; public String getMotherAttribute() { return motherAttribute; } //set public void setMotherAttribute(String motherAttribute) { this.motherAttribute= motherAttribute; } } 

    Überprüfen Sie diese https://firebase.google.com/support/guides/firebase-android

    es sagt

    "Wenn es eine zusätzliche Eigenschaft in deinem JSON gibt, die nicht in deiner Java-Klasse ist, wirst du diese Warnung in den Protokolldateien sehen: W / ClassMapper: Kein Setter / Feld für ignoreThisProperty gefunden auf Klasse com.firebase.migrationguide.ChatMessage"

    Blockquote

    Sie können diese Warnung loswerden, indem Sie eine @IgnoreExtraProperties-Annotation auf Ihre Klasse setzen. Wenn Sie möchten, dass Firebase-Datenbank sich wie im 2.x SDK verhält und eine Ausnahme ausgibt, wenn es unbekannte Eigenschaften gibt, können Sie eine @ThrowOnExtraProperties-Annotation auf Ihre Klasse setzen.

    Blockquote

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.