2016-10-11 10 views
6

İşte basit birincil Firebase verilerim. Benim android projedeYuvalanmış Firebase veritabanını Java'da Map <String, Obect> veya List <object> sınıfı ile nasıl deserialize edebilirsiniz?

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

ben bu verileri

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; } 
} 

bu verileri almak için getValue (elephant.class) yöntemini çağırabilirsiniz Bu şekilde temsil etmek bu sınıfı yaptı.

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

Çalışıyor.

Şimdi projeme bir iç içe düğüm ekliyorum.

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

database Image

Projemde Dimension.java denilen yeni bir sınıf oluşturduk:

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;} 
} 

Ve bu değişken/nesne dahil etmek benim elephant.java modifiye:

ve bunun için uygun yapıcı, alıcılar ve ayarlayıcılar.

ve önceki yöntemlerim hala çalışıyor. Tüm veri anlık görüntüsü için uygun java gösterimini döndürür.

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

ve ben DatabaseRef.child ('boyutu') bir datasnapshot olsun düzgün veri almak için getValue() yöntemine dimension.class geçebilir:

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

Bu nedenle, bu çok amaçlı sınıflar bana oldukça uygun.

Şimdi, Firebase verilerinin normalleştirilmesi/düzleştirilmesi gerektiğini biliyoruz. Ancak deneyler uğruna pushID ile bazı veriler eklediğimi söyleyelim. Şimdi

Database Screenshot

{ 
    "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" : {...} 
    } 
    } 
} 
, bu durum için önceki kod işi yapmak istiyorsanız: Ben 'nüfus' düğüm için yeni bir sınıf yazmak nasıl

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

.

Firebase başvurusunda, Map<String, Object> veya List<Object> java eşdeğerini döndürdüğü söylenir. Ama Java'da yeni başlayan biri olmaktan 4 gün sonra bu problemle karşılaştım.

dataSnapshot.child('population') aracılığıyla yineleyebilir ve ayrı bir 'population' nesnesinin listesine ekleyebilirsiniz. Ama bu şekilde elde edilip edilemeyeceğini merak ettim. Lütfen kodla bana yardımcı olun veya bana bir satırda ve otomatik olarak yapıldığı bir örneğe bağlantı verin. Böyle bir rahatlama olacak.

cevap

4

Bu tek deneyebilirsiniz:

class PopulationDetail { 
    long count; 
    String location; 
} 

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

İşe yaradı. :) Bu yoldan birkez daha düştüm, ama bir yerlerde kodlarım berbat ettim ve işe yaramadı. – BorhnN

+0

Çok teşekkür ederim :) – BorhnN

1

pojo sınıfa json dönüştürmek için, bu deneyin -

http://www.jsonschema2pojo.org/

+0

Yanıtladığınız için teşekkür ederiz. Bunun olduğunu bilmiyordum. JSON dosyamı oraya yapıştırdım ve kaynak türünde JSON'u seçtim. Sorun, normal tiplerle birlikte bir '-KTcpw_SsMb55qLc6Xme' sınıfı ve bir' -KTcq6YeB3kX3h9F9xPU' sınıfı oluşturdu. Ve ben istemediğim buydu. Bu yüzden şimdi JSON Schema'yı nasıl yazacağımı öğreniyorum. Firebase yerel dizi desteğine sahip olmadığından, bu nesneyi "Map " veya "List " tür sınıfını elde etmek için nasıl yazmalıyım? – BorhnN

+1

Bu durumda Huy Luu'nun yanıtını verebilirsiniz. –

İlgili konular