2016-07-31 88 views
8

故事火力地堡@PropertyName不起作用

我使用火力地堡实时数据库在我的应用程序。我有一个这样的模型。

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

现在,这个字段在我的实时数据库中存储为itemName。但我不想使用该命名约定。我想命名模式是这样的,item_name

我所做

我用@PropertyName( “ITEM_NAME”)这样的字段上方,

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

技术问题

火力地堡似乎只是忽略完全注释。我无法更改序列化和反序列化的属性名称。

任何帮助将不胜感激。

编辑

这里是备受关注的完整模型类,

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

如果你的课堂'公共'?这个领域是公开的吗?没有这两个,它将不会被序列化为JSON。 –

+0

我使用的是最新版本9.2.1。类和字段都是公共的,并且它们也是序列化的,只是更改属性名称的注释不受尊重。 –

回答

15

终于有机会来解决这个问题。感谢@hatboysam的建议。

唯一的问题是,@PropertyName注释未在Firebase中正确记录。

是必要的第一件事是场必须公共否则,注释将无法正常工作,这是很明显的/

现在注释考虑到这两个字段的名称以及吸气剂/ setter名称进行序列化。我也遇到了这样的问题,即字段以及getter/setter被序列化,导致重复的ket/value对

我通过使用字段名称上的注释公开并忽略了吸气器/设置器解决了问题。这完美地解决了这个问题。不是数据用我想要的属性名正确序列化,也没有重复的数据问题。

下面是一个简单的例子,

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

那么你不需要获得者和设置者,如果该字段是公开的 – Devrim

+1

我喜欢让getters/setter而不是访问任何公共领域。有时我需要在这些访问器方法中进行格式更改。 –

+0

可怜的firebase doc ..你拯救了我的一周..谢谢Dude .. –

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 = "")