2017-01-08 14 views
2

私はアプリケーションのバックエンドとしてfirebaseを使用しています。 まずFirebaseのインスタンスを使用してオブジェクトを完全に正常に動作するデータベースに保存しましたが、私の実装を保存するオブジェクトからキーを取得するように実装を変更しなければなりませんでした。実装を変更した後は、保存時にプロパティの一部を破棄します。FirebaseインスタンスとDatabaseReferenceの相違点

以下は、両方の実装のコードとスクリーンショットです。

実装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); 
     } 

実装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); 
    } 
    } 
    }); 

続い実装の結果とスクリーンショットです。 Result image

2番目の実装では強調表示されたプロパティがありません。 DatabaseReferenceで保存すると、なぜこれらのプロパティがなくなり、Firebaseのリファレンスで問題なくobejectsを保存できますか?

  1. これらの2つの方法を使用する特別なシナリオはありますか?
  2. なぜ私たちは別の方法で1つの方法を選択すべきですか?
  3. 2番目の実装でこの問題をどのように克服できますか?

更新。

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

クラスAdd。

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

クラスのモバイル

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

あなたの 'MobileAdd'クラスと' Mobile'クラスのコードを投稿してください。 _Implementation1_は、Jacksonを使用してPOJOをシリアル化/デシリアライズするFirebase Legacy SDKを使用します。 _Implementation2_は、Jacksonを使用しない新しいSDKを使用します。サポートされているアノテーションと受け入れられたPOJOフォームは、2つのSDKで異なります。 –

+0

@qbixクラスを追加 –

答えて

1

私は私のコメントで述べたように、Implementation1はPOJOをデシリアライズ/シリアライズするジャクソンを使用していますFirebaseレガシーSDKを使用しています。 Implementation2は、Jacksonを使用しない新しいSDKを使用します。サポートされているアノテーションと受け入れられたPOJOフォームは、2つのSDKで異なります。

フィールドは、大文字化エラーのため実装2によって書き込まれません。 getter/setterメソッドは、大文字の「D」のgetDescription()setDescription()である必要があります。

また、Dateは単純なPOJOではなく、新しいSDKによってシリアル化されません。 1つの選択肢は、Date.getTime()を使用し、日付を長いものとして保存することです。

+0

更新されたコード –

関連する問題