2017-01-08 1 views
2

Ich verwende Firebase als Back-End für meine Anwendung. Zuerst habe ich Firebase-Instanz verwendet, um Objekt in Firebase-Datenbank zu speichern, die vollkommen in Ordnung war, aber ich musste die Implementierung ändern, um Schlüssel aus Objekt für meine weitere Implementierung zu erhalten. Nach der Änderung der Implementierung werden jedoch beim Speichern einige Eigenschaften verworfen.Unterschied zwischen Firebase-Instanz und DatabaseReference

Im Folgenden finden Sie die Codes und Screenshots beider Implementierungen.

Umsetzung 1.

Firebase ref = null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_new_advertisement); 
     ref = new Firebase("https://xxxxxxxxxxxx.firebaseio.com/"); 
    } 
    addAdvertisement.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


    Mobile mobile = new Mobile(lclManu, lclMdl); 
     MobileAdd mobileAdd = new MobileAdd(); 

     mobileAdd.setMobile(mobile); 
     mobileAdd.setPrice(lclPrice); 
     mobileAdd.setdescription(lclDes); 
     mobileAdd.setDate(date); 


     User publishere = new User(); 
     Log.d("UUID", mAuth.getCurrentUser().getUid()); 
     publishere.setUUID(mAuth.getCurrentUser().getUid()); 

     ref.child("Advertisements").push().setValue(mobileAdd); 
     } 

Implementierung 2.

DatabaseReference ref = null; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_new_advertisement); 
    ref = FirebaseDatabase.getInstance().getReference(); 

    addAdvertisement.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     Mobile mobile = new Mobile(lclManu, lclMdl); 
     MobileAdd mobileAdd = new MobileAdd(); 

     mobileAdd.setMobile(mobile); 
     mobileAdd.setPrice(lclPrice); 
     mobileAdd.setdescription(lclDes); 
     mobileAdd.setDate(date); 

     User publishere = new User(); 
     mobileAdd.setPublisher(publishere); 

     DatabaseReference dbRef = ref.child("Advertisements").push(); 
     dbRef.setValue(mobileAdd); 
    } 
    } 
    }); 

Es folgt der Screenshot mit dem Ergebnis der Umsetzung. Result image

Hervorgehobene Eigenschaften fehlen in der zweiten Implementierung. Warum, wenn ich mit DatabaseReference speichere, fehlen mir diese Eigenschaften und mit Firebase Verweis kann ich obejects ohne Probleme speichern?

  1. Gibt es spezielle Szenarien, sollten wir diese beiden Methoden verwenden?
  2. Warum sollten wir eine Methode vor einer anderen wählen?
  3. Wie kann ich dieses Problem in der zweiten Implementierung überwinden?

Aktualisierung.

public class MobileAdd extends Add { 


    private Offer offers; 
    private Mobile mobile; 
    private User publisher; 
    private List<String> imagepaths; 

    public MobileAdd() { 
    } 

    public MobileAdd(String description, double price, Date date) { 
     super(description, price, date); 
    } 


    public MobileAdd(String description, double price, Date date,Offer offers, Mobile mobile, User publisher) { 
     super(description, price, date); 
     this.offers = offers; 
     this.mobile = mobile; 
     this.publisher = publisher; 
    } 

    public Offer getOffers() { 
     return offers; 
    } 

    public void setOffers(Offer offers) { 
     this.offers = offers; 
    } 

    public Mobile getMobile() { 
     return mobile; 
    } 

    public void setMobile(Mobile mobile) { 
     this.mobile = mobile; 
    } 

    public User getPublisher() { 
     return publisher; 
    } 

    public void setPublisher(User publisher) { 
     this.publisher = publisher; 
    } 

    public List<String> getImagepaths() { 
     return imagepaths; 
    } 

    public void setImagepaths(List<String> imagepaths) { 
     this.imagepaths = imagepaths; 
    } 
} 

Klasse hinzufügen.

public class Add { 

    private String key; 
    private String description; 
    private double price; 
    private Date date; 

    protected Add() { 
    } 
    public Add(String description, double price, Date date) { 
     this.description = description; 
     this.price = price; 
     this.date = date; 
    } 

    public String getdescription() { 
     return description; 
    } 

    public void setdescription(String description) { 
     this.description = description; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public void setPrice(double price) { 
     this.price = price; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 
} 

Klasse Mobil

public class Mobile{ 

    private String manufacturer; 
    private String model; 

    public Mobile() { 
    } 

    public Mobile(String manufacturer, String model) { 
     this.manufacturer = manufacturer; 
     this.model = model; 
    } 

    protected Mobile(Parcel in) { 
     manufacturer = in.readString(); 
     model = in.readString(); 
    } 
    public String getManufacturer() { 
     return manufacturer; 
    } 

    public void setManufacturer(String manufacturer) { 
     this.manufacturer = manufacturer; 
    } 

    public String getModel() { 
     return model; 
    } 

    public void setModel(String model) { 
     this.model = model; 
    } 

} 
+2

Geben Sie den Code für Ihre 'MobileAdd'- und' Mobile'-Klassen ein. _Implementation1_ verwendet das Firebase Legacy SDK, das Jackson zum Serialisieren/Deserialisieren von POJOs verwendet. _Implementation2_ verwendet das neue SDK, das nicht Jackson verwendet. Die unterstützten Anmerkungen und akzeptierten POJO-Formulare unterscheiden sich zwischen den beiden SDKs. –

+0

@qbix Klassen hinzugefügt –

Antwort

1

Wie ich in meinem Kommentar erwähnt, Implementation1 verwendet die Firebase Legacy-SDK, das Jackson verwendet zur Serialisierung/Deserialisierung POJOs. Implementation2 verwendet das neue SDK, das nicht Jackson verwendet. Die unterstützten Anmerkungen und akzeptierten POJO-Formulare unterscheiden sich zwischen den beiden SDKs.

Das description Feld wird nicht von Implementation2 wegen einer Großschreibung Fehler geschrieben. Die Getter/Setter-Methoden sollten getDescription() und setDescription() mit Großbuchstaben 'D' sein.

Auch Date ist kein einfaches POJO und wird nicht vom neuen SDK serialisiert. Eine Möglichkeit besteht darin, Date.getTime() zu verwenden und das Datum als Long zu speichern.

+0

Aktualisierten Code erneut –

Verwandte Themen