2016-10-11 13 views
6

Oto moje proste podstawowe dane z Bazy Firebase.Jak deserializować zagnieżdżone bazy danych Firebase w Javie za pomocą klasy Mapa <String, Obect> lub listy <object>?

{ 
    "elephant" : { 
    "color" : "gray", 
    "lifespan" : 48, 
    "status" : "endangered" 
    } 
} 

W moim projekcie android zrobiłem tej klasy do reprezentowania danych

public class elephant{ 
    private String color; 
    private int lifespan; 
    private String status; 

    // Constructors 
    public elephant(){ 
    } 

    public elephant(String color, int lifespan, String status) { . . . } 

    // Getters and Setters 
    public String getColor() { return color; } 

    public void setColor(String color) { this.color = color; } 

    public int getLifespan() { return lifespan; } 

    public void setLifespan(int lifespan) { this.lifespan = lifespan; } 

    public String getStatus() { return status; } 

    public void setStatus(String status) { this.status = status; } 
} 

ten sposób można wywołać metodę getValue (elephant.class), aby odzyskać te dane.

Elephant ele = datasnapshot.getValue(elephant.class); 

Działa.

Teraz dodaję jeden zagnieżdżony węzeł do mojego projektu.

{ 
    "elephant" : { 
    "color" : "gray", 
    "lifespan" : 48, 
    "status" : "endangered", 
    "dimension" : { 
     "height" : 270, 
     "length" : 607 
    } 
    } 
} 

database Image

Utworzyłem nową klasę o nazwie Dimension.java w moim projekcie:

public class Dimension { 
    private int length, height; 

    // Constructors 
    public Dimension() { } 

    public Dimension(int length, int height) { . . . } 

    // Public getters and setters 
    public int getLength() {return length;} 

    public void setLength(int length) {this.length = length;} 

    public int getHeight() {return height;} 

    public void setHeight(int height) {this.height = height;} 
} 

I zmodyfikowane mój elephant.java włączenie tej zmiennej/PRZEDMIOT:

private Dimension dimension; 

i odpowiedniego konstruktora, pobierających i ustawiających dla niego.

i moja poprzednia metoda nadal działa. Zwraca poprawną reprezentację java dla całego pliku danych.

Elephant ele = datasnapshot.getValue(elephant.class); 

, a jeśli dostanę datasnapshot w DatabaseRef.child ('wymiar') mogę przekazać dimension.class do getValue() aby uzyskać odpowiednie dane:

Dimension data = datasnapshot.getValue(dimension.class); 

Owe uniwersalnego zajęcia są dla mnie bardzo wygodne.

Teraz wiem, że dane Firebase mają być znormalizowane/spłaszczone. Ale jeśli chodzi o eksperymenty, powiedzmy, że dodałem trochę danych za pomocą metody pushID.

{ 
    "elephant" : { 
    "color" : "gray", 
    "status" : "endangered", 
    "lifespan" : 48, 
    "dimension" : { 
     "height" : 270, 
     "length" : 607 
    }, 
    "population" : { 
     "-KTcpw_SsMb55qLc6Xme" : { 
     "count" : 210, 
     "location" : "Bangladesh" 
     }, 
     "-KTcq6YeB3kX3h9F9xPU" : { 
     "count" : 428, 
     "location" : "Bhutan" 
     }, 
     "-KTcqDySLBAFtCuUc3R4" : {...}, 
     "-KTcqMyy4GULKo6FqPEM" : {...}, 
     "-KTcqWwtli672ROpry8_" : {...}, 
     "-KTcqhnBb6dTN1mA1otW" : {...} 
    } 
    } 
} 

Database Screenshot

Teraz, jeśli chcę zrobić poprzednią pracę kodu dla tego przypadku:

Elephant ele = datasnapshot.getValue(elephant.class); 

Jak mogę napisać nową klasę dla węzła „populacji”.

W bazie danych Firebase jest powiedziane, że zwraca ona odpowiednik java w postaci Map<String, Object> lub List<Object>. Ale będąc początkującym w Javie utknąłem z tym problemem w ciągu ostatnich 4 dni.

Potrafię iterować po numerze dataSnapshot.child('population') i dodawać je do listy osobnego obiektu "population". Ale zastanawiałem się, czy można to osiągnąć w ten sposób. Proszę pomóż mi z kodem lub połącz mnie z przykładem, gdzie zrobiono to w jednym wierszu i automatycznie. To będzie taka ulga.

Odpowiedz

4

Możesz spróbować tego:

class PopulationDetail { 
    long count; 
    String location; 
} 

class Elephan { 
    ... 
    Map<String, PopulationDetail> population; 
    ... 
} 
+0

to działało. :) Byłem na tej drodze raz, ale gdzieś w kodzie spieprzyłem i to nie zadziałało. – BorhnN

+0

Dziękuję bardzo :) – BorhnN

1

Aby przekonwertować json w klasie POJO, spróbuj tego -

http://www.jsonschema2pojo.org/

+0

Dzięki za odpowiedź. Nie wiedziałem, że to istnieje. Wkleiłem tam mój plik JSON i wybrałem JSON w wersji źródłowej. Problem polega na tym, że wraz z typami regularnymi tworzył klasę '-KTcpw_SsMb55qLc6Xme' oraz' -KTcq6YeB3kX3h9F9xPU'. I tego właśnie nie chciałem. Więc teraz uczę się pisać schemat JSON. W Firebase nie ma obsługi macierzy macierzystej, jak mam napisać ten obiekt, aby uzyskać klasę typu 'Map ' lub 'List '? – BorhnN

+1

W tym przypadku możesz zrobić, jak odpowiedział Huy Luu. –