2016-07-31 8 views
8

STORYFirebase @PropertyNameは、私は私のアプリでFirebaseリアルタイムデータベースを使用しています

を動作しません。私はこのようなモデルを持っています。

class Item { 
    int mItemName; 
    // Simplified for brevity 
} 

これで、リアルタイムデータベースにフィールドがitemNameとして保存されます。しかし、私はその命名規則を使用したくありません。私はこの命名パターンをitem_nameにします。私は私が問題

Firebaseはただ無視しているようだ

class Item { 
     @PropertyName("item_name") 
     int mItemName; 
     // Simplified for brevity 
    } 

、このようなフィールドの上@PropertyName( "ITEM_NAME")を使用

をやった

注釈を完全にシリアライズとデシリアライズのプロパティ名を変更する方法はありません。

ご協力いただければ幸いです。

public class FileModel { 

     @PropertyName("file_id") 
     String mFileId; 
     @PropertyName("file_name") 
     String mOriginalFileName; 
     @PropertyName("file_path") 
     String mFilePath; 
     @PropertyName("file_type") 
     String mFileType; 
     @PropertyName("last_modified") 
     Long mFileLastModified; 
     @PropertyName("file_size") 
     String mFileSize; 
     @Exclude 
     private boolean mIsSelected; 

     /** 
     * Must have empty constructor for JSON deserialization by Firebase 
     */ 
     public FileModel() { 
     } 

     public FileModel(String fileId, String originalFileName, 
            String filePath, String fileType, Long fileLastModified, String fileSize) { 
      this.mFileId = fileId; 
      this.mOriginalFileName = originalFileName; 
      this.mFilePath = filePath; 
      this.mFileType = fileType; 
      this.mFileLastModified = fileLastModified; 
      this.mFileSize = fileSize; 
     } 

     public String getFileId() { 
      return mFileId; 
     } 

     public void setFileId(String fileId) { 
      this.mFileId = fileId; 
     } 

     public String getOriginalFileName() { 
      return mOriginalFileName; 
     } 

     public void setOriginalFileName(String originalFileName) { 
      this.mOriginalFileName = originalFileName; 
     } 

     public String getFilePath() { 
      return mFilePath; 
     } 

     public void setFilePath(String filePath) { 
      this.mFilePath = filePath; 
     } 

     public String getFileType() { 
      return mFileType; 
     } 

     public void setFileType(String fileType) { 
      this.mFileType = fileType; 
     } 

     public Long getFileLastModified() { 
      return mFileLastModified; 
     } 

     public void setFileLastModified(Long fileLastModified) { 
      this.mFileLastModified = fileLastModified; 
     } 

     public String getFileSize() { 
      return mFileSize; 
     } 

     public void setFileSize(String fileSize) { 
      this.mFileSize = fileSize; 
     } 

     public boolean getIsSelected() { 
      return mIsSelected; 
     } 

     public void setIsSelected(boolean isSelected) { 
      this.mIsSelected = isSelected; 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (this == o) return true; 
      if (o == null || getClass() != o.getClass()) return false; 

      FileModel model = (FileModel) o; 

      if (mIsSelected != model.mIsSelected) return false; 
      if (mFileId != null ? !mFileId.equals(model.mFileId) : model.mFileId != null) return false; 
      if (mOriginalFileName != null ? !mOriginalFileName.equals(model.mOriginalFileName) : model.mOriginalFileName != null) 
       return false; 
      if (mFilePath != null ? !mFilePath.equals(model.mFilePath) : model.mFilePath != null) 
       return false; 
      if (mFileType != null ? !mFileType.equals(model.mFileType) : model.mFileType != null) 
       return false; 
      if (mFileLastModified != null ? !mFileLastModified.equals(model.mFileLastModified) : model.mFileLastModified != null) 
       return false; 
      return mFileSize != null ? mFileSize.equals(model.mFileSize) : model.mFileSize == null; 

     } 

     @Override 
     public int hashCode() { 
      int result = mFileId != null ? mFileId.hashCode() : 0; 
      result = 31 * result + (mOriginalFileName != null ? mOriginalFileName.hashCode() : 0); 
      result = 31 * result + (mFilePath != null ? mFilePath.hashCode() : 0); 
      result = 31 * result + (mFileType != null ? mFileType.hashCode() : 0); 
      result = 31 * result + (mFileLastModified != null ? mFileLastModified.hashCode() : 0); 
      result = 31 * result + (mFileSize != null ? mFileSize.hashCode() : 0); 
      result = 31 * result + (mIsSelected ? 1 : 0); 
      return result; 
     } 

     @Override 
     public String toString() { 
      return "FileModel{" + 
        "mFileId='" + mFileId + '\'' + 
        ", mOriginalFileName='" + mOriginalFileName + '\'' + 
        ", mFilePath='" + mFilePath + '\'' + 
        ", mFileType='" + mFileType + '\'' + 
        ", mFileLastModified=" + mFileLastModified + 
        ", mFileSize='" + mFileSize + '\'' + 
        ", mIsSelected=" + mIsSelected + 
        '}'; 
     } 
    } 
+0

Firebase Databaのどのバージョンあなたはあなたのbuild.gradleファイルに含まれていますか? –

+0

クラス 'public'の場合は?フィールドは公開されていますか?これらの2つがなければ、JSONにシリアル化されません。 –

+0

最新バージョンの9.2.1を使用しています。クラスとフィールドの両方がパブリックであり、プロパティ名を変更するためのアノテーションが尊重されていないという点でも、これらは直列化されています。 –

答えて

15

EDITここ

懸念で完全なモデルクラスがあるが、最終的にこの問題を解決するための機会を得ました。提案のために@hatboysamに感謝します。

唯一の問題は、@PropertyNameの注釈がFirebaseに正しく文書化されていないことです。必要である

最初の事はそう注釈が/非常に明白である、

を動作しませんフィールドが公共でなければなりません今、注釈を考慮にフィールド名だけでなく、ゲッターの両方を取ります/ setterの名前をシリアル化します。フィールドとgetter/setterがシリアル化されているという問題がありました。ケット/値ペアが重複しています

私はで公開されたフィールド名のアノテーションを使用し、ゲッター/セッターは無視して解決しました。これは問題を完全に解決しました。私が望んでいたプロパティ名でデータが適切にシリアライズされておらず、重複したデータ問題もありませんでした。ここで

は簡単な例で、

class Item { 

     @PropertyName("item_no") 
     int mItemNo; 
     // Simplified for brevity 

     @Exclude 
     public int getItemNo(){ 
       return mItemNo; 
     } 

     @Exclude 
     public void setItemNo(int itemNo){ 
       this.mItemNo = itemNo; 
     } 
    } 
+2

フィールドが公開されている場合、gettersとsetterは必要ありません – Devrim

+1

パブリックフィールドにアクセスするのではなく、getters/setterを保持したいのですが。時々、これらのアクセサメソッドで書式の変更を行う必要があります。 –

+0

悪い火災基地の医師..あなたは私の週を保存しました..ありがとう。 –

11

はまただけではなく、プロパティ自体に注釈を付けるの@PropertyNameであなたのゲッターをマーク - カスタム名を提供しながら、あなたがプライベートプロパティを維持することができますこの方法:

public class User extends Object { 

    private String mDisplayName; 


    @PropertyName("userName") 
    public String getDisplayName() { 
     return mDisplayName; 
    } 

    @PropertyName("userName") 
    public void setDisplayName(String displayName) { 
     mDisplayName = displayName; 
    } 

} 
4

ソリューションKotlinデータクラス用:

data class Pojo (@get:PropertyName("fieldName") @set:PropertyName("fieldName") var field: String = "") 
関連する問題